将某些行中的列折叠到R中列数最少的行

时间:2015-05-29 15:45:36

标签: r

我想知道如何使用没有NA的列数最少的行来折叠数据框中的列。有些行只有3列,其余的用NA填充。其他行的所有列都填充了数字而没有NA。我在下面提供了一个样本数据集,以及我希望成为理想的结果。

在下面的理想数据框中,中间列总是成为第2列。例如,具有5列的行折叠第1列和第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行。

如果我能让问题更容易回答,请告诉我。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这很笨重,但可能会奏效:

> 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