在没有FOR in R的另一个数据表中获取对应值

时间:2018-01-18 17:40:18

标签: r dataframe data.table apply lapply

我的英语不是很好,但我会尝试解释我的问题

我有一个这样的数据表(BASE_KPM_PD),我必须拿起值

MOB PD_MONTH
1   0,000
2   0,000
3   0,000
4   0,000
5   0,003
6   0,007
7   0,006
8   0,006
9   0,004

我还有其他数据表(BASE_MONTHS),其中包含每个月的值。这些值与上面数据表中的MOB列相同

MONTH_1 MONTH_2 MONTH_3
1        2        3
2        3        4
3        4        5
4        5        6
5        6        7
6        7        8
7        8        9

我需要检查值并将PD_MONTH通讯员提取到MOB。期望的输出低于

PD_MONTH1   PD_MONTH2   PD_MONTH3
0,000         0,000       0,000
0,000         0,000       0,000
0,000         0,000       0,003
0,000         0,003       0,007
0,003         0,007       0,006
0,007         0,006       0,006
0,006         0,006       0,004

我尝试的代码是。此代码有效,但它不是最好或最快的代码:

BASE_PD <- BASE_MONTHS 
      for (j in 1:3){
         BASE_PD <- merge(BASE_PD,
                         BASE_KPM_PD[,c("MOB","PD_MONTH")],
                         by.x = colnames(BASE_PD[paste0("MONTH_",j)]),
                         by.y = "MOB" )
        drops <- c(paste0("MONTH_",j))
        BASE_PD <- BASE_PD[,!names(BASE_PD) %in% drops]
        colnames(BASE_PD)[length(BASE_PD)] <- paste0("PD_MONTH_",j)
      }

提前谢谢。

1 个答案:

答案 0 :(得分:1)

在数据集BASE_KPM_PD中,您似乎具有索引列“MOB”和数据列“PD_MONTH”。只要这些指数保持正确的顺序(1-12,没有间隙),以下内容应该有效。

as.data.frame(lapply(BASE_MONTHS, function(x) BASE_KPM_PD$PD_MONTH[x]))

这会遍历BASE_MONTHS的每一列,并将其值用作BASE_KPM_PD的索引。