2017-04-11 38 views
2

所以这是一些示例数据,我有:符合条件语句后复制值?

signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 

而且我想添加第四列,这样,每当signal1==signal2==signal3均为1,新栏重复1,直到SIGNAL3从1变为0

所以从上面的例子中,我想产生类似:

signal1 signal2 signal3 signal_generate 
1   0   1   0 
1   1   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   0   0 

我想这将通过ifelse语句来实现,但我有很多困难在这个看似简单的任务。我想沿着线做的事:

signal_generate <- ifelse(data[,1]==data[,2]&data[,3]>0, rep(data[,3]==1), 0)

但我无法弄清楚如何让signal3重复的正确次数。

编辑:我正在意识到ifelse会很愚蠢,因为它只会查看条件signal1 == signal2 == signal3恰好满足的行。我仍然非常卡住,帮助将不胜感激!

回答

1

Replacing NAs with latest non-NA value

帮助我不知道初始条件得到正确处理。

df <- read.table(text=" 
signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 
", header=TRUE) 

library(zoo) 

# apply the logic using RowSums as a shortcut 
df$triple <- as.integer((rowSums(df[,1:3])) == 3L) 

# detect the change in signal and sett the initial condition 
df$signal_change <- ifelse(df$triple == 1L, 1L, ifelse(df$signal3 == 0L, 0, NA)) 
df$signal_change[1] <- df$triple[1] 

# generate the signal by carryign forward the changes 
df$signal_generate <- na.locf(df2$signal_change, na.rm=FALSE) 
df$signal_generate[1] <- df$signal_change[1] 

df 

# signal1 signal2 signal3 triple signal_change signal_generate 
# 1  1  0  1  0    0    0 
# 2  1  1  1  1    1    1 
# 3  1  0  1  0   NA    1 
# 4  1  0  1  0   NA    1 
# 5  1  0  1  0   NA    1 
# 6  1  0  1  0   NA    1 
# 7  1  0  0  0    0    0 
+0

谢谢。快速问题,'as.integer((rowSums(df [,1:3]))== 3L'只适用于表,或者可以用于'data.frame'吗?我试着在我的实际数据并且它返回所有内容的'0' – Nikitau

+0

来自rowSums的帮助“...对于数字数组(或数据框)”我没有你的数据的例子 - 最好使用'dput'并且添加我的例子是一个数据框架,我建议你通过执行从最内层到最外层的最小代码来检查结果,并检查你的括号 – epi99