我试图根据某些列是否为空来从一长串数据帧中选择数据帧。
这是一个可重现的示例,以及我为解决此问题而编写的代码。我使用一个随机变量作为另一个的可接受替代(这里,b表示c),所以如果df1 a在组1和组2中都结束,我不会感到困扰。
d1 <- data.frame(a=rnorm(5), b=1:5, c=rnorm(5))
d2 <- data.frame(a=1:5, b=rnorm(5), c = c(NA, NA, NA, NA, NA))
d3 <- data.frame(a=1:5, b=c(NA, NA, NA, NA, NA), c=c(1:5))
my_test_data <- list(d1, d2, d3)
group_1 <- list()
group_2 <- list()
for (i in 1:length(my_test_data)) {
if(!is.nan(my_test_data[[i]]$b)) {
group_1[i] <- my_test_data[i]
}
else if (!is.nan(my_test_data[[i]]$c)) {
group_2[i] <- my_test_data[i]
}
else NULL
}
我收到警告信息:
警告讯息: 1:在if(!is.nan(my_test_data [[i]] $ b)){: 条件的长度> 1,只使用第一个元素
,第1组和第2组与my_test_data
相同所有帮助非常感谢。
答案 0 :(得分:2)
示例代码中发生了一些问题。
您收到警告的原因是因为您的if条件正在返回一个向量。
is.nan(my_test_data[[3]]$b)
[1] FALSE FALSE FALSE FALSE FALSE`
您遇到的第二个问题是您的示例数据没有任何NaN
值。您有NA
个值...所以is.nan()
无论如何都找不到任何内容。
你遇到的第三个问题是你的if / else if / else格式不正确。 else if与大括号} else if () {
第四个问题是NULL
本身没有做任何事情。您也可以省略else NULL
因为它没有做任何事情。或者你可以改变它来做某事。
我们可以检查!is.na()
TRUE %in% is.na()
for (i in 1:length(my_test_data)) {
if(TRUE %in% is.na(my_test_data[[i]]$b)) {
group_1[i] <- my_test_data[i]
} else if (TRUE %in% is.na(my_test_data[[i]]$c)) {
group_2[i] <- my_test_data[i]
} # else {
# NULL
# }
}
现在,您的代码仍会有一些奇怪的列表,因为您在列表中存储了NULL值,但我不确定这对您正在做的事情是否正常。
str(group_1)
List of 3
$ : NULL
$ : NULL
$ :'data.frame': 5 obs. of 3 variables:
..$ a: int [1:5] 1 2 3 4 5
..$ b: logi [1:5] NA NA NA NA NA
..$ c: int [1:5] 1 2 3 4 5