【问题标题】:R - Finding Values in a Row based on CriteriaR - 根据标准连续查找值
【发布时间】: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))

标签: r dataframe


【解决方案1】:
getclosest <- function(df, i) {
   if (as.character(df$Cond[[i]]) == "t") {
      return (NA)
   } else {
      # df$Y[i]
      below <- NA
      above <- NA
      aj <- NA
      bj <- NA
      for (j in 1:5) {
          pos <- i - j
          if (pos < 1) break
          if (df$Cond[pos] == "t") {
            below <- df$Y[pos]
            bj <- j
            break
          }
      }
      for (j in 1:5) {
        pos <- i + j
        if (pos > nrow(df)) break 
        if (df$Cond[pos] == "t") {
           above <- df$Y[pos]
           aj <- j
           break
        }
      }
      temp = NA
      tempb = NA
      if (is.na(above) && is.na(below)) {
          return(NA)
      }
      if (!is.na(below) && !is.na(above)) {

        if (aj  < bj) {
           return(abs(above - df$Y[i]))
        } else {
           return(abs(below - df$Y[i]))
        }
      }
      if (!is.na(below)) {
        tempb <- abs(below - df$Y[i])
        return (tempb)
      }
      if (!is.na(above)) { 
         tempa <- abs(above - df$Y[i])
         return(tempa)
      }

    return (NA)
   }
}

df <- data.frame(Cond=c('n', 'n', 't','n','n','t','n','n','n','n','n','t'), Y=c(350,354,375,300,157,810,214,243,345,216,198,870))

v <- c() # length=nrow(df))
for (i in 1:nrow(df)) { 
   v[i] <- getclosest(df, i)
}

【讨论】:

  • 斯科特,这完美!非常感谢您的宝贵时间和见解!
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多