根据r中data.frame中的值创建两列

时间:2019-01-07 17:11:38

标签: r dplyr

我有一个约800万行的表。该表有15列带有数字值,但这些值只能是0和另一个数字值specific for that column。我想为每个列创建两个基于specific value的新列。这些新值总是特定于列。

这是一个虚拟的例子,我的数据看起来如何:

mydf1 <- data.frame(ID=1:5, c1n=c(0,1,0,0,1), c2n=c(2,0,2,0,0), c3n=c(0,0,0,3,3))

这是我想要的输出

 > mydf2
   ID c1n c1n_ctr c1n_cas c2n c2n_ctr c2n_cas c3n c3n_ctr c3n_cas
#1  1   0       0       0   2      25      55   0       0       0
#2  2   1      10     100   0       0       0   0       0       0
#3  3   0       0       0   2      25      55   0       0       0
#4  4   0       0       0   0       0       0   3     580    1002
#5  5   1      10     100   0       0       0   3     580    1002

对应关系始终相同,即c1n中的值1为(10,100)c2n中的值2为(25,55),值{{1} 3中的}是c3n

我知道我可以使用类似的东西

(580, 1002)

但是我的真实数据有15列,并且会粘贴很多副本,是否有任何清洁的方法?

1 个答案:

答案 0 :(得分:1)

假设您必须以某种方式写下具体值,那么可以使用此方法。

library(dplyr)
mydf1 <- data.frame(ID=1:5, c1n=c(0,1,0,0,1), c2n=c(2,0,2,0,0), c3n=c(0,0,0,3,3))

c1 <- data.frame(c1n=1, c1n_ctr=10, c1n_cas=100)
c2 <- data.frame(c2n=2, c2n_ctr=25, c2n_cas=55)
c3 <- data.frame(c3n=3, c3n_ctr=580, c3n_cas=1002)

mydf3 <- 
    mydf1 %>% 
    left_join(c1) %>% 
    left_join(c2) %>% 
    left_join(c3) %>% 
    mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))