一个数据集拆分成多个数据集后如何计算?
How do I perform calculations after splitting a datset into multiple datasets?
我想获取一个数据集并将其拆分为多个数据集。对于问题的简化版本。实际上,我将有数千行,但为了便于理解,我想简化问题。假设您有以下代码:
vec = c(1:10)
df = data.frame(vec)
df
vec
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
我想将此数据集拆分为每行 5 个观察值,然后获取每 5 行的平均值。
到目前为止,我已尝试按以下方式拆分代码:
splitdf = split(df, rep(1:2,each = 5))
现在我想得到每组的平均值。例如,第一个块的平均值是 3,第二个块的平均值是 8。
然后,我想做一个rep函数并将它存储在一个单独的列中。我希望我的数据框如下所示:
vec mean
1 1 3
2 2 3
3 3 3
4 4 3
5 5 3
6 6 8
7 7 8
8 8 8
9 9 8
10 10 8
我想知道循环函数是否合适,或者是否有更简单的方法来解决这个问题。我乐于接受建议。
如果您使用与分组相同的拆分逻辑,则无需拆分数据。例如,在 ave
df$mean <- ave(df$vec, rep(1:2,each = 5))
df
# vec mean
#1 1 3
#2 2 3
#3 3 3
#4 4 3
#5 5 3
#6 6 8
#7 7 8
#8 8 8
#9 9 8
#10 10 8
ave
中的默认函数已经是 mean
,所以我们不在这里明确应用它。
如果您想在此处处理拆分数据框,只需添加即可。
# Your vector
vec = c(1:10)
# your dataframe
df = data.frame(vec)
# Your split df
splitdf = split(df, rep(1:2,each = 5))
# -------------------------------------------------------------------------
#initialize a list (avg) with the size of splitdf
avg <- vector("list", length(splitdf))
# loop through each list and compute the mean and assign each to avg
for (i in seq_along(splitdf)){
avg[[i]] <- mean(splitdf[[i]]$vec)
}
# avg
# [[1]]
# [1] 3
#
# [[2]]
# [1] 8
# unlist avg and create a column mean on df
df$mean <- rep(unlist(avg), each=5)
# df
# vec mean
# 1 1 3
# 2 2 3
# 3 3 3
# 4 4 3
# 5 5 3
# 6 6 8
# 7 7 8
# 8 8 8
# 9 9 8
# 10 10 8
您可能正在寻找 by()
,它基本上提供了拆分应用功能。使用 rbind()
.
拆分
res <- do.call(rbind,
by(DF, rep(1:2, each=5), function(x)
cbind(x, mean=colMeans(x)) # perform calculations on subsets
)
)
res
# vec mean
# 1.1 1 3
# 1.2 2 3
# 1.3 3 3
# 1.4 4 3
# 1.5 5 3
# 2.6 6 8
# 2.7 7 8
# 2.8 8 8
# 2.9 9 8
# 2.10 10 8
数据
DF <- structure(list(vec = 1:10), class = "data.frame", row.names = c(NA,
-10L))
我想获取一个数据集并将其拆分为多个数据集。对于问题的简化版本。实际上,我将有数千行,但为了便于理解,我想简化问题。假设您有以下代码:
vec = c(1:10)
df = data.frame(vec)
df
vec
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
我想将此数据集拆分为每行 5 个观察值,然后获取每 5 行的平均值。
到目前为止,我已尝试按以下方式拆分代码:
splitdf = split(df, rep(1:2,each = 5))
现在我想得到每组的平均值。例如,第一个块的平均值是 3,第二个块的平均值是 8。
然后,我想做一个rep函数并将它存储在一个单独的列中。我希望我的数据框如下所示:
vec mean
1 1 3
2 2 3
3 3 3
4 4 3
5 5 3
6 6 8
7 7 8
8 8 8
9 9 8
10 10 8
我想知道循环函数是否合适,或者是否有更简单的方法来解决这个问题。我乐于接受建议。
如果您使用与分组相同的拆分逻辑,则无需拆分数据。例如,在 ave
df$mean <- ave(df$vec, rep(1:2,each = 5))
df
# vec mean
#1 1 3
#2 2 3
#3 3 3
#4 4 3
#5 5 3
#6 6 8
#7 7 8
#8 8 8
#9 9 8
#10 10 8
ave
中的默认函数已经是 mean
,所以我们不在这里明确应用它。
如果您想在此处处理拆分数据框,只需添加即可。
# Your vector
vec = c(1:10)
# your dataframe
df = data.frame(vec)
# Your split df
splitdf = split(df, rep(1:2,each = 5))
# -------------------------------------------------------------------------
#initialize a list (avg) with the size of splitdf
avg <- vector("list", length(splitdf))
# loop through each list and compute the mean and assign each to avg
for (i in seq_along(splitdf)){
avg[[i]] <- mean(splitdf[[i]]$vec)
}
# avg
# [[1]]
# [1] 3
#
# [[2]]
# [1] 8
# unlist avg and create a column mean on df
df$mean <- rep(unlist(avg), each=5)
# df
# vec mean
# 1 1 3
# 2 2 3
# 3 3 3
# 4 4 3
# 5 5 3
# 6 6 8
# 7 7 8
# 8 8 8
# 9 9 8
# 10 10 8
您可能正在寻找 by()
,它基本上提供了拆分应用功能。使用 rbind()
.
res <- do.call(rbind,
by(DF, rep(1:2, each=5), function(x)
cbind(x, mean=colMeans(x)) # perform calculations on subsets
)
)
res
# vec mean
# 1.1 1 3
# 1.2 2 3
# 1.3 3 3
# 1.4 4 3
# 1.5 5 3
# 2.6 6 8
# 2.7 7 8
# 2.8 8 8
# 2.9 9 8
# 2.10 10 8
数据
DF <- structure(list(vec = 1:10), class = "data.frame", row.names = c(NA,
-10L))