R 在数据帧中的变量数组中查找1个值的匹配项
我正在从SAS过渡到R,在“感觉”语言方面有一些困难 具有以下数据集: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
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也是如此,但它是一个数量。
我想做的是:
- 第一项任务
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)
关于第二个任务(假设它在
列中),您提到的第一行是NA,第二行是var
。在本例中,4
的实际数据为3。第3行(数据值2),第4行为NA。在第4行中,有var4
在1
之后。这似乎令人困惑。请避免在同一个问题中问很多问题。你甚至没有展示你所尝试过的。这看起来像是为我做的。R与SAS非常不同。这是一种真正的编程语言,它有一定的学习曲线,需要在你这方面进行更多的投资。你是对的,我想我认为我可以轻松掌握该语言的一些操作,但它似乎需要更多的时间。抱歉没有很好地组织问题!我想他在数数的时候跳过了一行,这让我很困惑。非常感谢重播。数据的结构使var1和res1对应于同一个月。var2和res2等也是如此。。这意味着,如果我发现var3中持有4个信用,我可以从res3中提取相应的金额。再次感谢您的及时重播!4
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