создать два столбца на основе значения в data.frame в r - PullRequest
0 голосов
/ 07 января 2019

У меня большая таблица ~ 8 миллионов строк. В этой таблице 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

Соответствие всегда одинаково, т. Е. Значение 1 в c1n равно (10,100), значение 2 в c2n равно (25,55), значение 3 в c3n равно (580, 1002).

Я знаю, что могу использовать что-то вроде этого

 mydf3 <- mutate(mydf1, c1n_ctr = ifelse(c1n == 1, 10, 0)) %>%
        mutate(c1n_cas = ifelse(c1n ==1, 100, 0)) %>%
            mutate(c2n_ctr = ifelse(c2n ==2, 25, 0)) %>%
            mutate(c2n_cas = ifelse(c2n ==2, 55, 0)) %>%
            mutate(c3n_ctr = ifelse(c3n ==3, 580, 0)) %>%
            mutate(c3n_cas = ifelse(c3n ==3, 1002, 0)) 

Но мои реальные данные имеют 15 столбцов, и было бы много копий, есть ли какой-нибудь чистый способ сделать это?

1 Ответ

0 голосов
/ 07 января 2019

Предполагая, что вам нужно каким-то образом записать конкретные значения, вы можете использовать этот подход.

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, .)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...