在数据帧中查找变量数组中的1个值

时间:2014-10-17 13:42:08

标签: 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   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例如是time(var1 - Jun, var2-Jul,等差异点的信用数量) 数组res1-res4也是如此,但它是一个数量。 我想做的是:

  1. 找到每个Key(在行内工作)第一次出现的4个信用点。所以应该有一个新的变量,例如FirstTime4Credits< - 数组的索引(var1-var4)。 在第一行,结果应为4(第一行为var4 = 4),第二行为3,第三行为=,等等。
  2. 然后我需要看到在达到4之后,客户端返回到1个信用点(第一行-NA,第二行= 4,第3行第3行,第4行= NA)并创建表示此变量的新变量。
  3. 最后,我需要根据客户达到4个学分和1个学分之后的时刻来获取res1-res4的金额--2个单独的新变量。
  4. 我设法做的第一项任务:

    varArray<-c("var1","var2","var3","var4")
    d$first4<- apply(d[varArray],1,match,x=4)
    

    其中&#34; d&#34;是上面提到的数据框导入。

    第二项任务现在对我来说是一个阻碍。我不知道如何根据变量值开始查看列表中的元素。

2 个答案:

答案 0 :(得分:1)

  • 第一项任务

     varNames <- grep("var", colnames(d))
     indx <- max.col(d[, varNames], "first")
     indx
     #[1] 4 3 1 2 2
    
  • 第二项任务

    indx1 <- max.col(df[, varNames]==1, "last")
    indx2 <- ifelse(indx1>indx, indx1, NA)
    indx2
    #[1] NA NA  4  3 NA
    
  • 第3项任务

     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")

答案 1 :(得分:0)

这是一种在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

我不确定你的意思是'来自res1-res4的金额基于客户达到4个学分和之后1个学分的时刻'。这个数字是否以某种方式加权来自任务1)和2)的指数之间的差异?