仅保留ID与以下行的ID不同的data.frame行

时间:2018-03-05 00:19:25

标签: r

我有一个data.frame。我想提取id[i] != id[i+1]的用户数据。换句话说,新的data.frame应该删除原始data.frame中的ID与下一行中的ID相同的任何行。

我正在做的事情如下:

counter <- 0 
temp_bind_1 <-
  read.csv("/Users/dushyanttanna/Documents/R_codes/temp_bind.csv")
##an empty file... just with header##

for (i in 2:100000) {
  if (df_merged$Id[i] != df_merged$Id[i+1]) {
    temp_file <- data.frame(temp_bind + df1[i,])
    counter <- counter + 1
    }
  }
print(counter) # just to see how many rows are there.... 
write.csv(temp_file,"temp_bind_final.csv", row.names = FALSE)

但它未能提供所需的输出。

1 个答案:

答案 0 :(得分:0)

这是一个演示如何执行此操作的最小示例。

让我们制作一些伪数据

set.seed(123)
x = data.frame(Id = sample(letters[1:3],10,T), value = rnorm(10))
#    Id      value
# 1   a  1.7150650
# 2   c  0.4609162
# 3   b -1.2650612
# 4   c -0.6868529
# 5   c -0.4456620
# 6   a  1.2240818
# 7   b  0.3598138
# 8   c  0.4007715
# 9   b  0.1106827
# 10  b -0.5558411

现在要提取id [i]!= id [i + 1]的行,我们可以做

x[c(diff(as.integer(x$Id)) !=0, TRUE), ]
#    Id      value
# 1   a  1.7150650
# 2   c  0.4609162
# 3   b -1.2650612
# 5   c -0.4456620
# 6   a  1.2240818
# 7   b  0.3598138
# 8   c  0.4007715
# 10  b -0.5558411

请注意,您没有指定如何处理data.frame的最后一行(它没有我们可以将它与之比较的后续行)。上面的代码假设您要保留最后一行。相反,如果您需要将其删除,则可以使用

x[c(diff(as.integer(x$Id)) !=0, FALSE), ]

另请注意,此方法假定Id列是因子或整数。如果不是,那么您应该先x$Id = factor(x$Id)