比较数据表中的列表

时间:2018-04-25 14:48:37

标签: r data.table

我有一个数据表(data),如下所示。

  rn    peoplecount 
  1     0,2,0,1
  2     1,1,0,0
  3     0,1,0,5
  4     5,3,0,2
  5     2,2,0,1
  6     1,2,0,3
  7     0,1,0,0
  8     0,2,0,8
  9     8,2,0,0
 10     0,1,0,0

我的目标是找出所有当前行的第一个元素与前一行的第四个元素不匹配的记录。在此示例中,第7行符合条件。如何获得所有此类记录的列表。

到目前为止我的尝试。

data[,  previous_peoplecount:= c(NA, peoplecount[shift(seq_along(peoplecount), fill = 0)])]

这给出了一个新表格如下:

  rn    peoplecount          previous_peoplecount
  1     0,2,0,1                   NA
  2     1,1,0,0              0,2,0,1
  3     0,1,0,5              1,1,0,0
  4     5,3,0,2              0,1,0,5
  5     0,2,0,1              5,3,0,2
  6     1,2,0,3              0,2,0,1
  7     0,1,0,0              1,2,0,3
  8     0,2,0,8              0,1,0,0
  9     8,2,0,0              0,2,0,8
 10     0,1,0,0              8,2,0,0

现在我必须获取people_count的第一个元素不等于previous_peoplecount的第四个元素的所有记录。我被困在这一部分。有什么建议吗?

编辑:poeplecount是数字列表。

3 个答案:

答案 0 :(得分:1)

你可以尝试删除除第一个值以外的所有值以及除最后一个值以外的所有值,并进行比较,即

library(data.table)

setDT(dt)[, first_pos := sub(',.*', '', peoplecount)][, 
         last_pos_shifted :=  sub('.*,', '', shift(peoplecount))][
                                         first_pos != last_pos_shifted,]

给出,

   rn peoplecount first_pos last_pos_shifted
1:  7     0,1,0,0         0                3

答案 1 :(得分:1)

我会转换为长格式,然后选择感兴趣的元素:

dt <- data.table(rn = 1:3, x = lapply(1:3, function(x) x:(x+3)))
dt$x[[2]] <- c(4, 1, 1, 1)
dt
#    rn       x
# 1:  1 1,2,3,4
# 2:  2 4,1,1,1
# 3:  3 3,4,5,6

# convert to long format
dt2 <- dt[, .(rn = rep(rn, each = 4), x = unlist(x))]
dt2[, id:= 1:4]
dtSelected <- dt2[x == shift(x) & id == 4]
dtSelected
#    rn x id
# 1:  2 1  4

dt[dtSelected$rn]
#    rn       x
# 1:  2 4,1,1,1

答案 2 :(得分:0)

我对答案不满意,并提出了我自己的解决方案如下:

h<-sapply(data$peoplecount,function(x){x[1]})
t<-sapply(data$peoplecount,function(x){x[4]})
indices<-which(head(t,-1)!=tail(h,-1))

感谢@Sotos和@minem让我朝着正确的方向前进。