преобразование разных строк фрейма данных в одну строку в R - PullRequest
1 голос
/ 13 декабря 2011

У меня есть набор данных, который выглядит следующим образом:

CATA 1 10101
CATA 2 11101
CATA 3 10011
CATB 1 10100
CATB 2 11100
CATB 3 10011

и т.д.

и я хочу объединить эти разные строки в одну длинную строку следующим образом:

CATA 101011110110011
CATB 101001110010011

Я пытался сделать это с помощью melt (), а затем dcast (), но, похоже, это не работает. У кого-нибудь есть несколько простых кусочков кода для этого?

Ответы [ 2 ]

7 голосов
/ 13 декабря 2011

Посмотрите на команду paste и, в частности, аргумент collapse. Непонятно, что должно произойти, если / когда у вас есть разные значения для первого столбца, поэтому я не рискну догадываться. Обновите свой вопрос, если вы застряли.

dat <- data.frame(V1 = "CATA", V2 = 1:3, V3 = c(10101, 11101, 10011))
paste(dat$V3, collapse= "")
[1] "101011110110011"

Обратите внимание, что вы, возможно, захотите сначала преобразовать данные в символ, чтобы предотвратить обрезание начальных нулей.

РЕДАКТИРОВАТЬ: для адресации нескольких значений для первого столбца

Используйте функцию plyr ddply, которая ожидает data.frame в качестве входных данных и группирующую переменную (переменные). Затем мы используем тот же трюк paste(), что и раньше, вместе с summarize().

    library(plyr)
    dat <- data.frame(V1 = sample(c("CATA", "CATB"), 10, TRUE)
                    , V2 = 1:10
                    , V3 = sample(0:100, 10, TRUE)
                    )

    ddply(dat, "V1", summarize, newCol = paste(V3, collapse = ""))

    V1         newCol
1 CATA          16110
2 CATB 19308974715042
0 голосов
/ 13 декабря 2011

Предполагая, что все возможные элементы в V1 из dat известны,

elements <- c("CATA","CATB","CATC")
i <- 1
final_list <- c()
while (i <= length(elements)){
k <- grep(elements[i], dat$V1, ignore.case = FALSE, fixed = TRUE, value = FALSE)
m <- paste(dat$V1[k[1]], " ", paste(dat[k,3], collapse=""), sep="")
final_list <- c(final_list,m)
i=i+1
}

@ Чейз-ответ гораздо лучше!

...