首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据行号和条件选择data.table R行

问根据行号和条件选择data.table R行
EN

Stack Overflow用户
提问于 2016-09-10 11:44:05
回答 1查看 12.8K关注 0票数 3

在data.table中,我们可以根据行号或条件选择行:

代码语言:javascript
复制
> x <- data.table(letters[1:4], 1:4)
> x
   V1 V2
1:  a  1
2:  b  2
3:  c  3
4:  d  4
> x[2]
   V1 V2
1:  b  2
> x[V1 == "d"]
   V1 V2
1:  d  4

但是,我不能同时选择行号和条件:

代码语言:javascript
复制
> x[!2 & V2 > 1]
Empty data.table (0 rows) of 2 cols: V1,V2

这可能是因为!2在这种格式中没有被解释为行号。我知道我可以将这两个条件链接起来:

代码语言:javascript
复制
> x[!2][V2 > 1]
   V1 V2
1:  c  3
2:  d  4

但是,我想为这个子集分配新的列值

代码语言:javascript
复制
x[!2][V2 > 1, V3 := "more"]

现在,它只为中间链接的data.table创建了列。我可以保存中间表,然后合并回原始表,但这会很麻烦。

实际上,我经常觉得data.table需要一个合适的行号。.I是一个依赖于组的动态数字,但我想要一个唯一的id来标识每一行,这个唯一的id在合并/连接中非常有用(通常数据没有唯一的id)。如果.i是行号,我可以使用

代码语言:javascript
复制
x[(.i != 2) & (V2 >1), V3 := "more"]

我可以通过首先显式地创建一个行号列来模拟这一点。

另一种方法是使对子集data.table的修改应用回原始表。假设我们有x作为原始表,x!2作为子集,那么如果对x[!2]的修改实际上修改了x,那么我的问题也会得到解决。当然,这种子集需要以不同的方式创建,例如x[!2, refOriginal = TRUE]。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-10 12:11:36

以下是我对解决方案的两种尝试:第一种使用data.table的汇总语法,使用行号.I和位置i处的条件计算逻辑向量,用于子集和更新列;第二种使用which和setdiff从条件中删除某些行号,另一方面,如果您需要行号和条件的and操作,可以用union替换setdiff

代码语言:javascript
复制
x[x[, .I != 2 & V2 > 2], V3 := "more"]
x
#    V1 V2   V3
# 1:  a  1   NA
# 2:  b  2   NA
# 3:  c  3 more
# 4:  d  4 more


x[setdiff(which(V2 > 2), c(2)), V3 := "more"]
x
#    V1 V2   V3
# 1:  a  1   NA
# 2:  b  2   NA
# 3:  c  3 more
# 4:  d  4 more
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39422316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档