【问题标题】:R DataTable Select RowsR DataTable 选择行
【发布时间】:2020-04-27 13:07:22
【问题描述】:
data1=data.frame("Student"=c(1, 1, 1, 2, 2, 2, 3, 3, 3),
"Grade"=c(1, 2, 3, 1, 2, 3, 1, 2, 3),
"Score"=c(5, 7, 9, 2, 2, 3, 10, NA, 3))


data2=data.frame("Student"=c(1, 1, 1, 3, 3, 3),
"Grade"=c(1, 2, 3, 1, 2, 3),
"Score"=c(5, 7, 9, 10, NA, 3))

我有 'data1' 并希望有 'data2',如果 'Grade' = 1 的 'Score' 至少为 4,我只包括 'Student'。

我对如何做到这一点的唯一了解是通过“成绩”和“分数”来做到这一点,但这并不能提供理想的输出。

library(data.table)
setDT(data1)
data1=data1[Grade==1 & Score >=4)

如何指定我希望选择所有 1 年级得分>=4 的学生,而不仅仅是 ROWS

【问题讨论】:

  • 可以做setDT(data1)[, if(Score[Grade == 1] >= 4) .SD, by = Student]或更麻烦的setDT(data1)[data1[Grade == 1 & Score >= 4], .SD, on = .(Student)]
  • @David Arenburg 非常感谢它在玩具示例中有效,但在真实数据中':参数长度为零'
  • 可能是因为你有学生没有Grade == 1?

标签: r data.table


【解决方案1】:

您只需要使用所需条件进行连接即可保留Student id。

这行得通吗?

library(data.table)
data1 <- data.frame("Student"=c(1, 1, 1, 2, 2, 2, 3, 3, 3),
                    "Grade"=c(1, 2, 3, 1, 2, 3, 1, 2, 3),
                    "Score"=c(5, 7, 9, 2, 2, 3, 10, NA, 3))
data2 <- data.frame("Student"=c(1, 1, 1, 3, 3, 3),
                    "Grade"=c(1, 2, 3, 1, 2, 3),
                    "Score"=c(5, 7, 9, 10, NA, 3))
setDT(data1)
setDT(data2)

wanted <- data1[ Grade == 1 & Score >= 4, .( Student ) ]

setkey( wanted, Student )
setkey( data1, Student )

data3 = data1[ wanted ]

data2
#>    Student Grade Score
#> 1:       1     1     5
#> 2:       1     2     7
#> 3:       1     3     9
#> 4:       3     1    10
#> 5:       3     2    NA
#> 6:       3     3     3
data3
#>    Student Grade Score
#> 1:       1     1     5
#> 2:       1     2     7
#> 3:       1     3     9
#> 4:       3     1    10
#> 5:       3     2    NA
#> 6:       3     3     3

reprex package (v0.3.0) 于 2020 年 4 月 29 日创建

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2016-07-29
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多