【发布时间】:2016-03-21 00:13:56
【问题描述】:
让我有这样一个数据框(df) 缺少值(NA)
df:
head1 head2 head3 head4 head5
----- ----- ----- ----- -----
65 25 12 65 76
78 5 NA 12 NA
NA NA 12 5 51
76 32 6 94 11
67 32 NA 1 NA
我想创建一个列表(list1),每个元素由具有相同 NA 模式的数据框组成。
对于这个例子:
- list1[1] 必须由具有 df$head1 和 df$head2 列的数据框 (df1) 组成
- list1[2] 必须由具有 df$head3 和 df$head5 列的数据框 (df2) 组成
- list1[3] 必须由具有列 df$head4 的数据框 (df3) 组成
如何使用 R 创建这样的列表?我会很高兴得到任何帮助。非常感谢。
@akrun,我意识到您的代码适用于每列不常见 NA 的数据帧。但不适用于以下数据框。
df1<-data.frame(head1=c(65,78,NA,76,67),
head2=c(25,5,NA,32,32),
head3=c(12,12,NA,6,NA),
head4=c(65,12,5,94,1),
head5=c(76,NA,51,11,NA)
)
i1 <- which(is.na(df1), arr.ind=TRUE)
l1 <- unique(split(i1[,2], i1[,1]))
i2 <- c(l1, setdiff(seq_along(df1), unlist(l1)))
l2 <- lapply(i2, function(i) df1[i])
l2[order(sapply(l2, function(x) colnames(x)[1]))]
结果是:
[[1]]
head1 head2 head3
1 65 25 12
2 78 5 12
3 NA NA NA
4 76 32 6
5 67 32 NA
[[2]]
head3 head5
1 12 76
2 12 NA
3 NA 51
4 6 11
5 NA NA
[[3]]
head4
1 65
2 12
3 5
4 94
5 1
[[4]]
head5
1 76
2 NA
3 51
4 11
5 NA
【问题讨论】:
-
好的阿克伦。但是,我的第一个例子似乎不是一个真实的例子。在这种情况下,是否最好在不同的主题中询问这个新示例?
-
第一个例子似乎很简单。我认为你可以有很多组合,即将每一列与许多其他列进行比较将是这里的场景(除非我没有记错)。是的,我的解决方案假设会有共同的元素。
-
你的“data.frame”的
dim是什么?is.na(df1)为每一列返回一个二进制变量。因此,您可以将其用作到split列的映射。 IE。split.default(df1, (t(is.na(df1)) %*% 2^(0:(nrow(df1) - 1L)))[, 1L])之类的东西,如果你有小的nrow或幼稚的split.default(df1, apply(is.na(df1) + 0L, 2, paste, collapse = "")) -
这是一个大数据框,大约有 115,000 行和 140 列。
标签: r