R 跨列的条件值更改

R 跨列的条件值更改,r,dplyr,mutate,rowsum,R,Dplyr,Mutate,Rowsum,我需要计算当一个值在0和1之间切换时,值分布在列之间,没有给定切换,并且存在NAs 我尝试了mutate和rowsumes,但几乎没有结果 例如: df <- data.frame(entry = c(1:5), year_1 = c(NA, NA, NA, 1, NA), year_2 = c(NA, NA, 0, 0, 1), year_3 = c(NA, 1, 1, 0, 1)) l要

我需要计算当一个值在0和1之间切换时,值分布在列之间,没有给定切换,并且存在NAs

我尝试了
mutate
rowsumes
,但几乎没有结果

例如:

df <- data.frame(entry = c(1:5), 
                year_1 = c(NA, NA, NA, 1, NA),
                year_2 = c(NA, NA, 0, 0, 1),
                year_3 = c(NA, 1, 1, 0, 1))

l要计算跨列的更改,可以计算数据的“超前”和“滞后”版本(按列)之间的差异。获取差异为1的索引,并使用这些索引创建“开关”:

ix <- which(df[ , 3:ncol(df)] - df[ , 2:(ncol(df) - 1)] == 1, arr.ind = TRUE) 
df$switch <- NA
df$switch[ix[ , 1]] <- paste0("year_", ix[ , 2])

df
#   entry year_1 year_2 year_3 switch
# 1     1     NA     NA     NA   <NA>
# 2     2     NA     NA      1   <NA>
# 3     3     NA      0      1 year_2
# 4     4      1      0      0   <NA>
# 5     5     NA      1      1   <NA>

ix你的意思是
c(不适用,不适用,“第二年”,不适用,不适用)
?这是因为在第3行中,您有一个从0到1的案例吗?我也不确定您想要的输出代表什么。你们能详细说明一下吗?我根据评论更新了这个问题。
l <- apply(df[, -1], 1, function(x) 
        names(df)[1 + which(tail(x, -1) == 1 & head(x, -1) == 0)])
unlist(ifelse(lengths(l), l, NA))

# [1] NA       NA       "year_2" NA       NA  
ix <- which(df[ , 3:ncol(df)] - df[ , 2:(ncol(df) - 1)] == 1, arr.ind = TRUE) 
df$switch <- NA
df$switch[ix[ , 1]] <- paste0("year_", ix[ , 2])

df
#   entry year_1 year_2 year_3 switch
# 1     1     NA     NA     NA   <NA>
# 2     2     NA     NA      1   <NA>
# 3     3     NA      0      1 year_2
# 4     4      1      0      0   <NA>
# 5     5     NA      1      1   <NA>