【问题标题】:Conditional value change across columns跨列的条件值更改
【发布时间】:2018-09-24 13:36:34
【问题描述】:

我需要计算一个值何时在 0 和 1 之间切换,值跨列分布,没有给出开关,并且存在 NA。

我尝试使用mutaterowSums,但收效甚微。

例子:

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)

【问题讨论】:

  • 你的意思是c(NA,NA,"year_2",NA,NA)?那是因为在第 3 行你有一个从 0 到 1 的案例吗?
  • 我也不确定您想要的输出代表什么。你能详细说明一下吗?
  • 我根据 cmets 更新了问题。

标签: r dplyr rowsum


【解决方案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  

【讨论】:

    【解决方案2】:

    要计算跨列的变化,您可以获取数据的“领先”和“滞后”版本(按列)之间的差异。获取差值为 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2022-11-30
      • 2018-08-04
      • 2013-12-27
      • 2021-10-09
      • 2019-08-20
      相关资源
      最近更新 更多