r-根据多列中的pmin从多列中找到对应的值

时间:2018-08-16 13:52:47

标签: r

我的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”?

1 个答案:

答案 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))