R 从上面和下面的行获取信息

R 从上面和下面的行获取信息,r,R,我是R新手,不知道如何从下面的数据中获得正确的输出: 我的数据: row1 101 woody 5 row2 101 woody 0 row3 111 kiln 23 row4 200 weez 2 row5 315 rowt 0 例如,在第3行中,第3列中的元素大于0,其第1列的值介于101行1和111行3之间。因此,对于任何行,条件是,如果第3列中的值大于0,并且第1列的值介于上下列的值之间 所需输出: col1 co

我是R新手,不知道如何从下面的数据中获得正确的输出:

我的数据:

row1    101 woody   5
row2    101 woody   0
row3    111 kiln    23
row4    200 weez    2
row5    315 rowt    0
例如,在第3行中,第3列中的元素大于0,其第1列的值介于101行1和111行3之间。因此,对于任何行,条件是,如果第3列中的值大于0,并且第1列的值介于上下列的值之间

所需输出:

        col1 col2   col3
row1    101 woody   After_none
row2    101 woody   0
row3    111 kiln    Between_woody_weez
row4    200 weez    Between_Kiln_rowt
row5    315 rowt    0
如果有人能帮助我,我会很高兴的。谢谢

添加了更多数据以运行Akru的代码:

col1    col2    col3
255 mwu 21
77031   netw    0
77031   netw    0
77031   netw    0
82513   cuu 91
88206   cxum    0
88206   cxum    0
88206   cxum    0
188450  xaii    25
188450  xaii    0
188450  xaii    0
188450  xaii    0
188450  xaii    0
199800  aau 0
代码使用此数据示例运行,但输出不完全正确:

col1 col2 col3              colN
255  mwu   21        After_none
77031 netw    0              <NA>
77031 netw    0              <NA>
77031 netw    0              <NA>
82513  cuu   91  Between_mwu_netw
88206 cxum    0              <NA>
88206 cxum    0              <NA>
88206 cxum    0              <NA>
188450 xaii   25 Between_netw_cxum
188450 xaii    0              <NA>
188450 xaii    0              <NA>
188450 xaii    0              <NA>
188450 xaii    0              <NA>
199800  aau 0                 <NA>
或者用额外的柱子colN就可以了

预期产出:

col1 col2 col3              
255  mwu   21        
77031 netw    0              
77031 netw    0              
77031 netw    0              
82513  Between_mwu_cxum   91
88206 cxum    0              
88206 cxum    0              
88206 cxum    0              
188450 Between_cxum_aau   25 
188450 xaii    0              
88450 xaii    0              
188450 xaii    0              
188450 xaii    0   
199800  aau 0   
一种方法是:

  indx <- df$col3 >0
  df$colN <- df$col3
  df$colN[indx] <- sapply(which(indx), function(i) {
      i1 <- 1:(i - 1)
      i2 <- (i + 1):nrow(df)
      indx1 <- with(df, col1[i] > col1[i1])
      indx2 <- with(df, col1[i] < col1[i2])
      if (any(indx1) & any(indx2)) 
       paste("Between", df$col2[i1][max(which(indx1))], df$col2[i2][min(which(indx2))], 
             sep = "_") else df$col3[i]
   })

  df
  #     col1 col2 col3              colN
  #1     255  mwu   21                21
  #2   77031 netw    0                 0
  #3   77031 netw    0                 0
  #4   77031 netw    0                 0
  #5   82513  cuu   91 Between_netw_cxum
  #6   88206 cxum    0                 0
  #7   88206 cxum    0                 0
  #8   88206 cxum    0                 0
  #9  188450 xaii   25  Between_cxum_aau
  #10 188450 xaii    0                 0
  #11 188450 xaii    0                 0
  #12 188450 xaii    0                 0
  #13 188450 xaii    0                 0
  #14 199800  aau    0                 0
数据
我能问一下无后的条件是什么吗?是101号复制品的第一个条目吗?@jazzurro是的,是第一个条目。我猜上面没有一行,它将以_none命名。但是,我对这个问题有点困惑。到目前为止,我还没有听到OP的任何回复。我想dplyr中的@jazzurro可能是另一种选择?我是用SOfun包中的getMyRows来实现的,它允许我执行类似的过程。我的代码不像你的那么紧凑;我想我不会发布它。你会如何处理这两者之间的关系?@jazzurro我没有时间考虑这个过程。另外,我没有从OP那里得到任何反馈。所以,我将等待。您的预期输出令人困惑。为什么第82513行有介于\u mwu \u cxum之间的数据?那不是在网络和网络之间吗?或者新规则是,我们必须只从>0的行中进行选择?很抱歉造成混淆。你说得对。它应该在\u netw\u cxum之间。我不明白注释col2没有包括…之间的替换字符串。。。。你能澄清一下吗?你希望它在那里是什么?您显示了这些行的预期输出,但没有任何中间值。无论如何,我花了一些时间在这上面。对不起,我只是展示了一些没有替代品的例子。我现在将展示完整的示例。谢谢
  indx <- df$col3 >0
  df$colN <- df$col3
  df$colN[indx] <- sapply(which(indx), function(i) {
      i1 <- 1:(i - 1)
      i2 <- (i + 1):nrow(df)
      indx1 <- with(df, col1[i] > col1[i1])
      indx2 <- with(df, col1[i] < col1[i2])
      if (any(indx1) & any(indx2)) 
       paste("Between", df$col2[i1][max(which(indx1))], df$col2[i2][min(which(indx2))], 
             sep = "_") else df$col3[i]
   })

  df
  #     col1 col2 col3              colN
  #1     255  mwu   21                21
  #2   77031 netw    0                 0
  #3   77031 netw    0                 0
  #4   77031 netw    0                 0
  #5   82513  cuu   91 Between_netw_cxum
  #6   88206 cxum    0                 0
  #7   88206 cxum    0                 0
  #8   88206 cxum    0                 0
  #9  188450 xaii   25  Between_cxum_aau
  #10 188450 xaii    0                 0
  #11 188450 xaii    0                 0
  #12 188450 xaii    0                 0
  #13 188450 xaii    0                 0
  #14 199800  aau    0                 0
 df$col2[indx] <-sapply(which(indx), function(i) {
     i1 <- 1:(i - 1)
     i2 <- (i + 1):nrow(df)
     indx1 <- with(df, col1[i] > col1[i1])
     indx2 <- with(df, col1[i] < col1[i2])
     if (any(indx1) & any(indx2)) 
     paste("Between", df$col2[i1][max(which(indx1))], df$col2[i2][min(which(indx2))], 
         sep = "_") else df$col2[i] #replaced here
   })

 df
 #    col1              col2 col3
 #1     255               mwu   21
 #2   77031              netw    0
 #3   77031              netw    0
 #4   77031              netw    0
 #5   82513 Between_netw_cxum   91
 #6   88206              cxum    0
 #7   88206              cxum    0
 #8   88206              cxum    0
 #9  188450  Between_cxum_aau   25
 #10 188450              xaii    0
 #11 188450              xaii    0
 #12 188450              xaii    0
 #13 188450              xaii    0
 #14 199800               aau    0
 df <-  structure(list(col1 = c(255L, 77031L, 77031L, 77031L, 82513L, 
 88206L, 88206L, 88206L, 188450L, 188450L, 188450L, 188450L, 188450L, 
 199800L), col2 = c("mwu", "netw", "netw", "netw", "cuu", "cxum", 
 "cxum", "cxum", "xaii", "xaii", "xaii", "xaii", "xaii", "aau"
 ), col3 = c(21L, 0L, 0L, 0L, 91L, 0L, 0L, 0L, 25L, 0L, 0L, 0L, 
 0L, 0L)), .Names = c("col1", "col2", "col3"), class = "data.frame", 
 row.names = c(NA,-14L))