我想知道如何折叠具有不带NA的列数最少的行的数据帧中的列。有些行只有3列,其余的则用NA填充。其他行的所有列均填充有数字,而没有NA。我在下面提供了一个样本数据集,并希望将其作为理想的结果。
在下面的理想数据框中,中间列始终变为列2。例如,具有5列的行将列1和2折叠为1,将列4和5折叠为3。
a <- c(1, 1, 1, 1, 1, 1)
b <- c(2, 2, 2, 2, 2, 2)
c <- c(3, 3, 3, 3, 3, 3)
d <- c(NA, 4, NA, 4, 4, NA)
e <- c(NA, 5, NA, 5, 5, NA)
f <- c(NA, NA, NA, 6, 6, NA)
g <- c(NA, NA, NA, 7, 7, NA)
df <- data.frame(a, b, c, d, e, f, g)
ideal data.drame
ai <- c(1, 3, 1, 1, 5, 1)
bi <- c(2, 3, 2, 2, 4, 2)
ci <- c(3, 9, 3, 3, 18, 3)
di <- c(NA, NA, NA, NA, NA, NA)
ei <- c(NA, NA, NA, NA, NA, NA)
fi <- c(NA, NA, NA, NA, NA, NA)
gi <- c(NA, NA, NA, NA, NA, NA)
dfi <- data.frame(ai, bi, ci, di, ei, fi, gi)
原因是我需要清理有关政治和人口统计的数据集以进行分析。每行代表民意调查受访者,从保守到自由。有些民意调查只有3个类别的自由主义/保守派,有些则有5或7个类别。对我而言,唯一有意义的方法是将每一行折叠为具有最少列数的行(在我的示例数据帧中为3)。实际的数据集有成千上万的行,因此我需要一种自动化的方式来完成它。
数据框未按任何特定顺序排序。我曾考虑过将列切成百分位数,但这会错误地解释具有7列的行,因为只有中间列(4)应该是第2行。
请让我知道我是否可以使问题更容易回答,并感谢您的帮助。
这很笨拙,但可能会起作用:
> apply(df, 1, function(x) {y <- na.omit(x); m <- length(y) %/% 2; c(sum(y[1:m]), y[m + 1], sum(y[(m + 2):length(y)]))})
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 1 6 6 1
[2,] 2 3 2 4 4 2
[3,] 3 9 3 18 18 3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句