【发布时间】:2015-01-22 21:28:29
【问题描述】:
我有一个具有两个基本条件的数据集,我正在尝试根据它们在数据框中的位置来匹配这些值。这是一个例子:
Row Cond Y
1 n 350
2 n 354
3 t 375
4 n 300
5 n 157
6 t 810
7 n 214
8 n 243
9 n 345
10 n 216
11 n 198
12 t 870
我想将“n”的每个值与附近的“t”值相匹配(即,彼此相距 5 行以内)。然后,我想从“t”中减去“n”的值。在上面的示例中,我们的第 1 行将与第 3 行匹配,我们会得到一个值 25 (375 - 350)。如果该行在两个“t”行之间等距,如果可能,我想默认为较早的“t”行。理想情况下,我会在适当的情况下创建一个具有这些差异分数的新向量,以便为具有“t”条件的行显示“NA”或“0”。所以这看起来像:
Result
25
21
NA
75
653
NA
596
567
465
654
672
NA
有没有办法在 R 中实现这一点?我已经根据标准(例如“
【问题讨论】:
-
例如,当 n 是两个 t 的第 8 行之间的相同距离时会发生什么)。很高兴您提供了示例数据,但如果分享此示例数据的预期结果也会很有帮助,这样我们就可以测试可能的解决方案。
-
你想要的输出是什么样的?
-
更新了预期输出和一些说明。感谢您的观看!
-
如果在
n的3行内没有t会发生什么? -
试试这个
sapply(X = 1:nrow(df), FUN = function(i) ifelse(df[i,"Cond"]=="t", NA, df[(j<-which(df[,"Cond"]=="t"))[which.min(abs(i-j))], "Y"]-as.numeric(df[i,"Y"])))。 df 使用了df = structure(list(Row = 1:12, Cond = structure(c(1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c("n", "t"), class = "factor"), Y = c(350L, 354L, 375L, 300L, 157L, 810L, 214L, 243L, 345L, 216L, 198L, 870L)), .Names = c("Row", "Cond", "Y"), class = "data.frame", row.names = c(NA, -12L))