根据以前的行替换R中的行值

时间:2017-07-19 11:19:59

标签: r dataframe

以下是我的数据框df

df <- data.frame(A=c(1,1,1,1,0,0,-1,-1,-1,1,1,1,1))

我希望有另一个变量T_D,当A1遇到-1值的变化时,会保留第一个值并替换下一行0

预期产出:

A  T_D
1  1
1  0
1  0
1  0
0  0 
0  0
-1 -1
-1  0
-1  0 
1  1
1  0  
1  0
1  0   

4 个答案:

答案 0 :(得分:1)

dplyr&#39; window functions让这一切变得简单。您可以使用lag函数查看上一个值,看它是否等于当前值。表格的第一行没有前一个值,因此T_D始终为NA。幸运的是,该行始终等于a,因此使用第二个mutate(或df[1,2] <- df[1,1])修复这个问题很容易。

library(tidyverse) # Loads dplyr and other useful packages

df <- tibble(a = c(1, 1, 1, 1, 0, 0, -1, -1, -1, 1, 1, 1, 1))

df %>%
  mutate(T_D = ifelse(a == lag(a), 0, a)) %>%
  mutate(T_D = ifelse(is.na(T_D), a, T_D))

答案 1 :(得分:1)

df$T_D <- sign(abs(df$A)*diff(c(0, df$A)))

答案 2 :(得分:1)

data.table方法是,

library(data.table)
setDT(df)[, T_D := replace(A, duplicated(A), 0), by = rleid(A)][]

#     A T_D
# 1:  1   1
# 2:  1   0
# 3:  1   0
# 4:  1   0
# 5:  0   0
# 6:  0   0
# 7: -1  -1
# 8: -1   0
# 9: -1   0
#10:  1   1
#11:  1   0
#12:  1   0
#13:  1   0

答案 3 :(得分:0)

Base R解决方案,这似乎对您有用:

df$T_D = df$A*!c(FALSE,diff(df$A,lag=1)==0),

找出连续行之间的差异。如果差值为1,则从A列获取条目,否则设置为0.

输出

    A T_D
1   1   1
2   1   0
3   1   0
4   1   0
5   0   0
6   0   0
7  -1  -1
8  -1   0
9  -1   0
10  1   1
11  1   0
12  1   0
13  1   0