我有一个类似于上面的data.frame。我需要根据第二列的值替换第一列中的值,但是替换需要继续第1列的数值,并且仅在!ValB==A
>df1
ValA ValB
1 A
1 A
2 A
2 A
3 A
3 A
4 A
4 A
1 B
1 B
1 B
2 B
2 B
3 B
4 B
4 B
1 C
1 C
2 C
2 C
3 C
3 C
4 C
1 C
我想要的是替换column1中的值,但使用ValB==B
作为替换ValA
中的值的索引。替换必须继续ValA
中的值,即,当1
和ValB==B
ValA
必须是5
时,2
1}}必须是6
,依此类推。请在这里找到所需的输出,这将使我更容易理解我在做什么。我可以使用if
和elseif
语句执行for循环,但我确信有更简洁的方法,
期望的输出
>df1
ValA ValB
1 A
1 A
2 A
2 A
3 A
3 A
4 A
4 A
5 B
5 B
5 B
6 B
6 B
6 B
7 B
7 B
8 C
8 C
9 C
9 C
10 C
10 C
11 C
12 C
答案 0 :(得分:1)
你可以这样做。它基本上在布尔向量上运行累积和,告诉您一行的ValA和ValB是否等于前一行的ValA和ValB -
# do a running sum of the values
df$c = cumsum(
c(
# first value of the result is the same value as the first value of A
df$ValA[1],
# go through the second to the last value of the vector and compared it to the first to the n - 1th values
sapply(
2:nrow(df),
function(index) {
# look for change in value of A and B both
# if changed then return 1, else return 0
!(
df$ValA[index] == df$ValA[index - 1] &
df$ValB[index] == df$ValB[index - 1]
)
}
)
))