R 如何用“删除”删除所有单元格;不适用;按列列出的值
这个问题不是重复的,因为我的R 如何用“删除”删除所有单元格;不适用;按列列出的值,r,R,这个问题不是重复的,因为我的data.frame并非所有列中的NA值都相同,因此该问题中提到的解决方案不起作用 我有一个data.frame,其中包含大量的NA值,我想删除所有具有NA值的单元格(重要信息:不是行或列,而是单元格)。原图如下所示: A B 1 NA NA 2 2 NA NA NA NA NA NA 4 3 5 A B 1 2 2 4 3 5 预期结果如下所示: A B 1 NA NA 2 2 NA NA NA NA NA NA 4 3 5 A B
data.frame
并非所有列中的NA
值都相同,因此该问题中提到的解决方案不起作用
我有一个data.frame
,其中包含大量的NA
值,我想删除所有具有NA值的单元格(重要信息:不是行或列,而是单元格)。原图如下所示:
A B
1 NA
NA 2
2 NA
NA NA
NA NA
NA 4
3 5
A B
1 2
2 4
3 5
预期结果如下所示:
A B
1 NA
NA 2
2 NA
NA NA
NA NA
NA 4
3 5
A B
1 2
2 4
3 5
列数必须保持不变,但值是否保留在相同的行上并不重要。他们可以向上移动
我可以想象一个人可以删除所有条件为NA的单元格(可能是应用),然后得到结果。或者简单的分类
谢谢
更新:
A B C
1 3
2
4 3
1 2
3 5
4
9
7 1
您可以根据@UweBlock的数据和您更新的问题进行尝试
dat=as.data.frame(na.omit(apply(dat,2,function (x) x[order(is.na(x))])))
dat
A B C
1 1 2 3
2 4 1 3
3 3 9 2
OP已要求按列删除
NA
s,但指出每列中可能有不同数量的NA
这可以通过使用数据来解决。表分两步进行:
library(data.table)
# step 1: coerce to data.table in place, move NAs to the bottom of each column,
# maintain the original order of non-NA values
result <- data.table(DF)[, lapply(.SD, function(x) x[order(is.na(x))])]
因此,在每个列mn的末尾将不可避免地出现一些NA
s,因为data.frame中的所有列都具有相同的长度
或者,使用is.na
参数到na.trim()
,只能保留完整的行:
另一种解决办法
如前所述,data.frame
s和cbind()
期望所有列向量具有相同的长度。这是一个没有数据的替代解决方案。表使用rowr
包中的cbind.fill()
函数,该函数使用fill
值填充向量,直到长度相同:
setNames(do.call(function(...) rowr::cbind.fill(..., fill = NA), lapply(DF, na.omit)),
colnames(DF))
资料
由OP在更新中提供:
DF <- structure(list(A = c(1L, NA, 4L, NA, NA, NA, 3L, NA, NA, 7L),
B = c(NA, 2L, NA, NA, 1L, NA, NA, NA, 9L, NA), C = c(3L,
NA, 3L, NA, 2L, NA, 5L, 4L, NA, 1L)), .Names = c("A", "B",
"C"), row.names = c(NA, -10L), class = "data.frame")
dftrydata.frame(lappy(df1,na.omit))
每列的na数是否相同?否则,您将遇到问题bc data.frames需要具有相同长度的列。您可以只使用普通列表。不,有很多NAs和很少的实际值,它们不是相同的数字。谢谢您的帮助。使用此选项后,我得到一个空变量/文件。初始数据是否需要转换为任何特定的数据(data.frame、list、matrix)?或者我在这里遗漏了什么。@user413734我假设您正在处理数据。frameYes我遗漏了。运行代码后,我在Rstudio的环境面板中获得chr[0,1:255]。我的原始数据中有255列。在此之前的所有转换都显示相同数量的列和行。这段代码似乎删除了NA所在的所有行以及列中出现的所有NA。你知道我还能尝试什么吗。感谢您的帮助。我刚刚用更新的示例文件尝试了您的代码,尽管它在原则上达到了预期效果,但它忽略了A行中的值7和C行中的值5、4、1。我相信它必须是相同数量的值(3)。但对我来说,行是否保留在原始文件中并不重要。@UweBlock阅读更新的问题并编辑我的答案~谢谢你的帮助~:)
A B C
1: 1 2 3
2: 4 1 3
3: 3 9 2
setNames(do.call(function(...) rowr::cbind.fill(..., fill = NA), lapply(DF, na.omit)),
colnames(DF))
A B C
1 1 2 3
2 4 1 3
3 3 9 2
4 7 NA 5
5 NA NA 4
6 NA NA 1
DF <- structure(list(A = c(1L, NA, 4L, NA, NA, NA, 3L, NA, NA, 7L),
B = c(NA, 2L, NA, NA, 1L, NA, NA, NA, 9L, NA), C = c(3L,
NA, 3L, NA, 2L, NA, 5L, 4L, NA, 1L)), .Names = c("A", "B",
"C"), row.names = c(NA, -10L), class = "data.frame")