是否有优雅的解决方案从NA值清除数据帧而不删除NA所在的行或列?
示例:
输入数据框
C1 C2 C3
R1 A <NA> <NA>
R2 <NA> A <NA>
R3 <NA> <NA> A
R4 B <NA> <NA>
R5 <NA> B <NA>
R6 <NA> <NA> <NA>
R7 C <NA> B
R8 C <NA>
R9 <NA>
R10 <NA>
R11 C
输出数据框
C1 C2 C3
R1 A A A
R2 B B B
R3 C C C
例如,这是一个杂乱的数据帧(df1),其中包含NA值
A B C D E F G H I J K
1 Healthy <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 <NA> Healthy <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 <NA> <NA> Healthy <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 <NA> <NA> <NA> Healthy <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 <NA> <NA> <NA> <NA> Healthy <NA> <NA> <NA> <NA> <NA> <NA>
6 <NA> <NA> <NA> <NA> <NA> Healthy <NA> <NA> <NA> <NA> <NA>
以下是数据帧的应用方式。
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11
1 Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy
2 Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy
3 Healthy ICDAS_1_2 ICDAS_1_2 Healthy ICDAS_1_2 ICDAS_1_2 ICDAS_1_2 Healthy Healthy ICDAS_1_2 ICDAS_1_2
4 Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy
5 Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy
6 Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy Healthy
请注意,原始数据帧中的单元格B-2现在位于X2-1中。因此,这里的主要问题是找到等同于&#34;删除单元格并移动所有单元格&#34;来自Calc或Excel的功能
我找到的所有答案都删除了&lt; NA&gt;的所有行或列。价值是。 我设法做到的方式是(并且如果这是原始的,那就是抱歉)只将有效值提取到新的数据帧:
首先。我创建了一个空数据框
library("data.table") # required package
new_dataframe <- data.frame(matrix("", ncol = 11, nrow = 1400) )
然后,我将每个有效值从旧数据帧复制到新数据帧
new_dataframe$X1 <- df1$A[!is.na(df2$A)]
new_dataframe$X2 <- df1$B[!is.na(df2$B)]
new_dataframe$X3 <- df1$C[!is.na(df2$C)]
等
所以,我的问题是:是更优雅的解决方案&#34; clean&#34;来自NA值的数据框?
非常感谢任何帮助。
答案 0 :(得分:1)
如果这适用于您:
new_dataframe$X1 <- df1$A[!is.na(df2$A)]
new_dataframe$X2 <- df1$B[!is.na(df2$B)]
new_dataframe$X3 <- df1$C[!is.na(df2$C)]
然后这应该自动工作:
new_dataframe = as.data.frame(lapply(df1, na.omit))
也应该有效(在任意数量的列上)。 (更直接的代码翻译是皮埃尔在评论中提出的建议:as.data.frame(lapply(mydf, function(x) x[!is.na(x)]))
。)
小心数据框必须是矩形(每列必须具有相同的行数),因此这可能会像您希望的那样工作,并且只能如果每列具有相同数量的非缺失值。如果某些行具有较少的非缺失值,则它们将被回收以填充数据帧的长度:
x = data.frame(a = c(1, NA, 2), b = c(2, NA, 3), c = c(NA, "A", NA))
x
# a b c
# 1 1 2 <NA>
# 2 NA NA A
# 3 2 3 <NA>
as.data.frame(lapply(x, na.omit))
# a b c
# 1 1 2 A
# 2 2 3 A
更好的方法可能是首先转换为列表:
y = lapply(x, na.omit)
在决定是否要强制使用数据框之前,您可以查看自己拥有的内容sapply(y, length)
。