我想根据其他列中的值向数据框添加一列。我想要一个特定的值,第一次只有一个值出现在另一列中。例如:
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
谁能告诉我出了什么问题?
答案 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