为R中的其他列中的第一个唯一值添加特定列值

时间:2014-07-06 12:31:28

标签: r for-loop

我想根据其他列中的值向数据框添加一列。我想要一个特定的值,第一次只有一个值出现在另一列中。例如:

 s <- c(6,5,6,7,8,7,6,5)
 i <- c(4,5,4,3,2,3,4,5)
 t <- c(1,1,3,4,5,6,6,8)
 df<- data.frame(t,s,i)
 > df
   t s i
 1 1 6 4
 2 1 5 5
 3 3 6 4
 4 4 7 3
 5 5 8 2
 6 6 7 3
 7 6 6 4
 8 8 5 5

现在我要添加一个列&#34;标记&#34;第一次给出1 = 1,第一次给出t = 6。所以我得到:1 0 0 0 0 1 0 0.我有这个代码:

    for(i in 1:nrow(df)){
         if (df$t[i] == 1 & df$t[i-1] != 1 | (df$t[i] == 6 & df$t[i-1] != 6)){
              df$mark[i] <- 1
         } else {
              df$mark[i] <- 0
         }
    }

然而,这会产生以下错误:

     Error in if (df$t[i] == 1 & df$t[i - 1] != 1 | (df$t[i] == 6 & df$t[i -  :argument is of length zero

谁能告诉我出了什么问题?

2 个答案:

答案 0 :(得分:1)

不要使用循环,只需执行

df$mark <- 0
df$mark[match(c(1, 6), df$t)] <- 1

来自?match文档

  

匹配返回其(第一)个匹配位置的向量   第二个论点。

您在循环中收到错误的原因是因为您从1循环到nrow(df)。但是在你的循环中你指定df$t[i-1],这在你的第一次迭代中基本上意味着df$t[0];这是一个不存在的条目

答案 1 :(得分:0)

  within(df, mark<- (c(1,diff(t %in% c(1,6)))==1) +0)
   #     t s i mark
   #   1 1 6 4    1
   #   2 1 5 5    0
   #   3 3 6 4    0
   #   4 4 7 3    0
   #   5 5 8 2    0
   #   6 6 7 3    1
   #   7 6 6 4    0
   #   8 8 5 5    0

或者

  duplicated(df$t,fromLast=T) +0
  #[1] 1 0 0 0 0 1 0 0