从数据帧列表中选择数据帧

时间:2017-11-29 20:13:27

标签: r list for-loop if-statement

我试图根据某些列是否为空来从一长串数据帧中选择数据帧。

这是一个可重现的示例,以及我为解决此问题而编写的代码。我使用一个随机变量作为另一个的可接受替代(这里,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

相同

所有帮助非常感谢。

1 个答案:

答案 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