我想获取一个数据集并将其拆分为多个数据集。对于问题的简化版本。实际上,我将有数千行,但出于理解的目的,我想简化该问题。假设您有以下代码:
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
我想知道循环函数是否合适,或者是否有更简单的方法来解决此问题。我愿意提出建议。
答案 0 :(得分:3)
如果要在拆分数据帧上工作,只需添加以下内容即可。
# 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
答案 1 :(得分:2)
如果您使用与组相同的拆分逻辑,则无需拆分数据。例如,在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
,因此我们在这里没有明确应用。
答案 2 :(得分:1)
您可能正在寻找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))