R 从上面和下面的行获取信息
我是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
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))