对 r 中的 NA 值求和
Sum NA values in r
我正在使用具有多个 NA 值的数据框,因此我正在考虑根据它们的 NA 值对属性进行排序。
我试图使用 for
循环,这是我目前所拥有的:
> data <- read.csv("C:/Users/Nikita/Desktop/first1k.csv")
> for (i in 1:length(data) ) {
+ temp <- c(sum(is.na(data[i])))}
> temp
[1] 0
这是我第一次在 r 中使用 for 循环,所以我确信这只是一个愚蠢的语法问题,但我无法理解到底是哪一个。
最终,我需要一个显示属性名称及其 NA 计数的列表。这样我就可以对列表进行排序并获得所需的信息。这里有一些模拟数据,使它更容易。
data <- data.frame(A = c(500, 600, 700, 1000),
B = c(500, 600, 700, NA),
C = c(NA, NA, 500, 700),
D = c(800, NA, 933, NA),
E = c(NA, NA, NA, NA))
编辑:
谢谢大家的帮助。这三种解决方案都对我有用。我确实想知道是否有一行代码可以在将这些属性导出到文件之前对它们进行排序。就像我之前提到的,我在 r
中还很陌生,所以我不确定是否可行。
编辑 2:
当我 运行 时,排序给了我下一个错误:
temp <- sort(temp)
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) :
'x' must be atomic
知道为什么吗?
这是使用 is.na
和 colSums
的快速回答:
colSums(is.na(data))
返回:
A B C D E
0 1 2 2 4
对于您的上述数据。
感谢@akrun 展示我的盈余apply
这个答案展示了如何使 for 循环工作。
temp <- vector(length = ncol(data))
for (i in 1:length(data)) {
temp[i] <- c(sum(is.na(data[, i])))
}
names(temp) <- colnames(data)
temp
# A B C D E
# 0 1 2 2 4
在 R 中执行迭代代码的正确方法是避免显式 for
循环。请改用 apply
(和公司)。 @jeremycg 给了你正确的 R-ish 答案。关于您的代码,您应该进行一些编辑以使其正常工作。
temp <- c()
for (i in 1:length(data)){
temp[names(data)[i]] <- sum(is.na(data[i]))
}
您在每次迭代中都temp
重写了。此外,您没有将变量的标签写入temp
。因此,您看到的输出是数据集最后一列中 NA
的数量。
关于 OP 的编辑
temp <- sort(temp) # pass decreasing=T into arguments in case
# you want reversed order
我正在使用具有多个 NA 值的数据框,因此我正在考虑根据它们的 NA 值对属性进行排序。
我试图使用 for
循环,这是我目前所拥有的:
> data <- read.csv("C:/Users/Nikita/Desktop/first1k.csv")
> for (i in 1:length(data) ) {
+ temp <- c(sum(is.na(data[i])))}
> temp
[1] 0
这是我第一次在 r 中使用 for 循环,所以我确信这只是一个愚蠢的语法问题,但我无法理解到底是哪一个。
最终,我需要一个显示属性名称及其 NA 计数的列表。这样我就可以对列表进行排序并获得所需的信息。这里有一些模拟数据,使它更容易。
data <- data.frame(A = c(500, 600, 700, 1000),
B = c(500, 600, 700, NA),
C = c(NA, NA, 500, 700),
D = c(800, NA, 933, NA),
E = c(NA, NA, NA, NA))
编辑:
谢谢大家的帮助。这三种解决方案都对我有用。我确实想知道是否有一行代码可以在将这些属性导出到文件之前对它们进行排序。就像我之前提到的,我在 r
中还很陌生,所以我不确定是否可行。
编辑 2: 当我 运行 时,排序给了我下一个错误:
temp <- sort(temp)
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) :
'x' must be atomic
知道为什么吗?
这是使用 is.na
和 colSums
的快速回答:
colSums(is.na(data))
返回:
A B C D E
0 1 2 2 4
对于您的上述数据。
感谢@akrun 展示我的盈余apply
这个答案展示了如何使 for 循环工作。
temp <- vector(length = ncol(data))
for (i in 1:length(data)) {
temp[i] <- c(sum(is.na(data[, i])))
}
names(temp) <- colnames(data)
temp
# A B C D E
# 0 1 2 2 4
在 R 中执行迭代代码的正确方法是避免显式 for
循环。请改用 apply
(和公司)。 @jeremycg 给了你正确的 R-ish 答案。关于您的代码,您应该进行一些编辑以使其正常工作。
temp <- c()
for (i in 1:length(data)){
temp[names(data)[i]] <- sum(is.na(data[i]))
}
您在每次迭代中都temp
重写了。此外,您没有将变量的标签写入temp
。因此,您看到的输出是数据集最后一列中 NA
的数量。
关于 OP 的编辑
temp <- sort(temp) # pass decreasing=T into arguments in case
# you want reversed order