跨列的条件值更改
Conditional value change across columns
我需要计算值何时在 0 和 1 之间切换,值分布在列中,未给出切换,并且存在 NA。
我尝试了 mutate
和 rowSums
但收效甚微。
示例:
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))
想要的结果:
switch = c(NA, NA, "year_2", NA, NA)
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
要计算跨列的变化,您可以获取数据的 'lead' 和 'lag' 版本(按列)之间的差异。获取差值为 1 的索引,并使用它们创建 'switch':
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>
我需要计算值何时在 0 和 1 之间切换,值分布在列中,未给出切换,并且存在 NA。
我尝试了 mutate
和 rowSums
但收效甚微。
示例:
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))
想要的结果:
switch = c(NA, NA, "year_2", NA, NA)
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
要计算跨列的变化,您可以获取数据的 'lead' 和 'lag' 版本(按列)之间的差异。获取差值为 1 的索引,并使用它们创建 'switch':
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>