我的df是这样的:
Item P P1 P2 P3 D1 D2 D3 pmin num NP
A 10 8 11 20 2 1 10 1 D2 11
B 10 8 11 20 2 1 10 1 D2 11
C 10 8 11 20 2 1 10 1 D2 11
D 50 40 35 70 10 15 20 10 D1 40
E 20 15 22 30 5 2 10 2 D2 22
如上面的df所示,我首先计算了D1和D2,“ pmin”是D1和D2的并行最小值,“ num”给出了与我的pmin对应的列名(D1或D2)。
现在我要返回的是一个名为“ NP”的新列,该列根据pmin(通过查看行)为我提供了P1或P2中的相应值。例如,如果说'num'中的D2,则查看该行,则从P2返回值;如果说'num'中的D1,则从P1中返回值。
不确定我的解释是否很好,但这是我对'pmin'和'num'所做的操作:
df$pmin = do.call(pmin, df[,5:6] )
df$num = apply(df[,5:6], 1,function(x) names(x)[which.min(x)])
在我的真实数据集中,我还有P1到P4,D1到D4。
我尝试过某事
ifelse( num == 'D1', P1, P2)
但不适用于两列(P1〜P4 ..)
提前谢谢!
顺便说一句,有人知道如何使用
case_when()
从库(dplyr)获得“ NP”?
答案 0 :(得分:0)
我们可以使用row/column
索引来提取与“ D1”,“ D2”相对应的“ P1 / P2”列的元素
m1 <- cbind(seq_len(nrow(df)), match(df$num, c("D1", "D2", "D3")))
df$NP <- df[c("P1", "P2", "P3")][m1]
df$NP
#[1] 11 11 11 40 22
df <- structure(list(Item = c("A", "B", "C", "D", "E"), P = c(10L,
10L, 10L, 50L, 20L), P1 = c(8L, 8L, 8L, 40L, 15L), P2 = c(11L,
11L, 11L, 35L, 22L), P3 = c(20L, 20L, 20L, 70L, 30L), D1 = c(2L,
2L, 2L, 10L, 5L), D2 = c(1L, 1L, 1L, 15L, 2L), D3 = c(10L, 10L,
10L, 20L, 10L), pmin = c(1L, 1L, 1L, 10L, 2L), num = c("D2",
"D2", "D2", "D1", "D2"), NP = c(11L, 11L, 11L, 40L, 22L)),
class = "data.frame", row.names = c(NA,
-5L))