R 在数据帧中的变量数组中查找1个值的匹配项

R 在数据帧中的变量数组中查找1个值的匹配项,r,R,我正在从SAS过渡到R,在“感觉”语言方面有一些困难 具有以下数据集: Key var1 var2 var3 var4 res1 res2 res3 res4 1 1 2 3 4 100 121 34565 4345 2 2 1 4 3 200 56 345 345 3 4 3 2 1 100 34 3 6 4 1 4 1 2 100 3 2 43 5

我正在从SAS过渡到R,在“感觉”语言方面有一些困难

具有以下数据集:

Key var1    var2    var3    var4    res1    res2    res3    res4
1   1   2   3   4   100 121 34565   4345
2   2   1   4   3   200 56  345 345
3   4   3   2   1   100 34  3   6
4   1   4   1   2   100 3   2   43
5   1   4   4   2   400 6   34  3

structure(list(Key = 1:5, var1 = c(1L, 2L, 4L, 1L, 1L), var2 = c(2L, 
1L, 3L, 4L, 4L), var3 = c(3L, 4L, 2L, 1L, 4L), var4 = c(4L, 3L, 
1L, 2L, 2L), res1 = c(100L, 200L, 100L, 100L, 400L), res2 = c(121L, 
56L, 34L, 3L, 6L), res3 = c(34565L, 345L, 3L, 2L, 34L), res4 = c(4345L, 
345L, 6L, 43L, 3L)), .Names = c("Key", "var1", "var2", "var3", 
"var4", "res1", "res2", "res3", "res4"), class = "data.frame", row.names = c(NA, -5L))
其中,
var1
-
var4
是例如在
时间的不同点(var1-Jun,var2-Jul,
等)的学分数 数组res1-res4也是如此,但它是一个数量。 我想做的是:

  • 要查找每个键(在行内工作)的4个信用的第一次出现。因此应该有一个新变量,例如FirstTime4Credits
    • 第一项任务

       varNames <- grep("var", colnames(d))
       indx <- max.col(d[, varNames], "first")
       indx
       #[1] 4 3 1 2 2
      

      varNames以下是一种在发生4之后查找1的索引的方法:

      df1 <- df[varArray] == 1 * (t(apply(df[varArray] == 4, 1, cumsum)) > 0)
      bar <- function(x) ifelse(length(x) == 0, NA, x)
      sapply((apply(df1, 1, which)), bar) 
      #[1] NA NA  4  3 NA
      
      df1(0)
      
      关于第二个任务(假设它在
      var
      列中),您提到的第一行是NA,第二行是
      4
      。在本例中,
      var4
      的实际数据为3。第3行(数据值2),第4行为NA。在第4行中,有
      1
      4
      之后。这似乎令人困惑。请避免在同一个问题中问很多问题。你甚至没有展示你所尝试过的。这看起来像是为我做的。R与SAS非常不同。这是一种真正的编程语言,它有一定的学习曲线,需要在你这方面进行更多的投资。你是对的,我想我认为我可以轻松掌握该语言的一些操作,但它似乎需要更多的时间。抱歉没有很好地组织问题!我想他在数数的时候跳过了一行,这让我很困惑。非常感谢重播。数据的结构使var1和res1对应于同一个月。var2和res2等也是如此。。这意味着,如果我发现var3中持有4个信用,我可以从res3中提取相应的金额。再次感谢您的及时重播!
      indx1 <- max.col(df[, varNames]==1, "last")
      indx2 <- ifelse(indx1>indx, indx1, NA)
      indx2
      #[1] NA NA  4  3 NA
      
       resNames <- grep("res", colnames(d))
       d1 <- d[, resNames]
       d1[cbind(seq_along(indx), indx)]
       #[1] 4345  345  100    3    6
      
       d1[cbind(seq_along(indx2), indx2)] 
       #[1] NA NA  6  2 NA
      
       d <- structure(list(Key = 1:5, var1 = c(1L, 2L, 4L, 1L, 1L), var2 = c(2L, 
       1L, 3L, 4L, 4L), var3 = c(3L, 4L, 2L, 1L, 4L), var4 = c(4L, 3L, 
       1L, 2L, 2L), res1 = c(100L, 200L, 100L, 100L, 400L), res2 = c(121L, 
       56L, 34L, 3L, 6L), res3 = c(34565L, 345L, 3L, 2L, 34L), res4 = c(4345L, 
       345L, 6L, 43L, 3L), first4 = c(4L, 3L, 1L, 2L, 2L)), .Names = c("Key", 
       "var1", "var2", "var3", "var4", "res1", "res2", "res3", "res4", 
       "first4"), row.names = c(NA, -5L), class = "data.frame")
      
      df1 <- df[varArray] == 1 * (t(apply(df[varArray] == 4, 1, cumsum)) > 0)
      bar <- function(x) ifelse(length(x) == 0, NA, x)
      sapply((apply(df1, 1, which)), bar) 
      #[1] NA NA  4  3 NA