【问题标题】:R Data.table. Need modify column using grouping and complex conditional filteringR 数据表。需要使用分组和复杂条件过滤修改列
【发布时间】:2018-12-18 09:25:18
【问题描述】:

这是数据样本:

zz <- "
id  Sub_Segment1    Sub_Segment2    Sub_Segment3    Sub_Segment4    Sub_Segment5
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
"

Data <- read.table(text=zz, header = TRUE)
setDT(Data)

如果我将修改应用到整个表,它会返回 NA:

Data[(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1),name:="test" , by=id ]

返回:

 id Sub_Segment1 Sub_Segment2 Sub_Segment3 Sub_Segment4 Sub_Segment5 name
 1:  1            x           x1            r           y1           z1   NA
 2:  1            x           x1            r           y1           z1   NA
 3:  1            x           x1            r           y1           z1   NA
 4:  1            x           x1            r           y1           z1   NA
 5:  1            x           x1            r           y1           z1   NA
 6:  1            x           x1            r           y1           z1   NA
 7:  1            x           x1            r           y1           z1   NA
 8:  2            y           x2            r           y2           z1   NA
 9:  2            y           x2            r           y2           z1   NA
10:  2            y           x2            r           y2           z1   NA
11:  2            y           x2            r           y2           z1   NA
12:  2            y           x2            r           y2           z1   NA

但如果我在子段中只取一个具有恒定值的样本,它会起作用:

new_data = Data[id ==1]
new_data[(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1),name:="test" , by=id ]

返回正确

   id Sub_Segment1 Sub_Segment2 Sub_Segment3 Sub_Segment4 Sub_Segment5 name
1:  1            x           x1            r           y1           z1 test
2:  1            x           x1            r           y1           z1 test
3:  1            x           x1            r           y1           z1 test
4:  1            x           x1            r           y1           z1 test
5:  1            x           x1            r           y1           z1 test
6:  1            x           x1            r           y1           z1 test
7:  1            x           x1            r           y1           z1 test

Data[id ==1,(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1) ] # returns TRUE

我应该如何修改代码以将我的函数应用于 data.table 中的每一组数据集?

【问题讨论】:

  • 问题是在你的修改中,你做了:(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1),这对我来说不匹配任何行。
  • @ira 如果 group_by 应用它应该匹配,但它不是
  • 所以您想对 group by 中的每个组应用过滤条件?
  • @ira 对,我想对过滤后的数据应用过滤条件和修改
  • data.table中的i-expression不按组操作

标签: r if-statement data.table filtering grouping


【解决方案1】:

您可以将要编辑的行的标识移动到命令的一部分,您可以在其中选择列:

# load data table package
library(data.table)
# create the data table from string
Data <- read.table(text=zz, header = TRUE)
setDT(Data)
# group by and adjust where condition is matched
Data[, name := ifelse(length(unique(Sub_Segment1[Sub_Segment1!=""])) == 1, "test", NA) , by=id ]

除了 ifelse,您还可以在任何地方进行修改,然后进行过滤,或者使用连接操作。

【讨论】:

  • 由于您只需要每组计算一次,我建议使用if .. else 而不是ifelse。另外,您可以使用 data.table 的 uniqueN 来保持代码简短。 Data[, name := if(uniqueN(Sub_Segment1[Sub_Segment1 != ""]) == 1) "test" else NA, by = id]
  • 是的,你是对的。另外:Data[, name := "test"[uniqueN(Sub_Segment1[Sub_Segment1!=""]) == 1], by = "id"]
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2019-11-20
  • 2013-12-23
相关资源
最近更新 更多