【问题标题】:For two dataframes df and logicaldf of the same size, what does the command df[logicaldf, ] execute in R?对于相同大小的两个数据帧 df 和 logicaldf,命令 df[logicaldf, ] 在 R 中执行什么?
【发布时间】:2021-12-07 10:32:00
【问题描述】:

我最近遇到了df[logicaldf,] 命令并且真的很困惑,因为我只看到了df[x,] 格式,其中x 是dataframe 中的一列。这是我在 R 中运行代码时的示例块:

> c1 <- c(11, 2, 3, 4, 53)
> c2 <- c(9, 3, 5, 5, 2)
> c3 <- c(1, 10, 3, 2, 2)
> foo <- data.frame(c1, c2, c3)
 
> foo5 <- foo > 5
> head(foo5)
        c1    c2    c3
[1,]  TRUE  TRUE FALSE
[2,] FALSE FALSE  TRUE
[3,] FALSE FALSE FALSE
[4,] FALSE FALSE FALSE
[5,]  TRUE FALSE FALSE

> table(rowSums(foo5))
0 1 2 
2 2 1 

> foo[foo5, ]
     c1 c2 c3
1    11  9  1
5    53  2  2
NA   NA NA NA
NA.1 NA NA NA

有人能解释一下这里发生了什么吗?

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    如果省略逗号,则只需提取 foo5==TRUE: 所在的元素:

    foo[foo5]
    ## 11 53  9 10
    

    但是,由于包含逗号,foo5 将转换为矩阵,然后转换为向量。因此括号内的foo5 变为:

    as.vector(as.matrix(foo5))
    ## TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
    

    现在,4 个TRUEs 出现在位置 1、5、6 和 12。因此您的子集命令 (foo[foo5,]) 正在尝试从 foo 中获取第 1、5、6 和 12 行。因此,结果是第 1 行和第 5 行,以及两行 NAs,因为 foo 没有第 6 行和第 12 行。

    请注意,我们可以像这样复制您的结果:

    foo[c(1,5,6,12), ]
     ##      c1 c2 c3
     ## 1    11  9  1
     ## 5    53  2  2
     ## NA   NA NA NA
     ## NA.1 NA NA NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多