Свертывание нескольких строк по уникальному идентификатору, нескольким значениям (столбцам), нескольким элементам в переменной (строкам) - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь свернуть несколько строк по уникальному идентификатору в R, но в каждом столбце может быть несколько переменных, которые я хочу сохранить в отдельных строках. Как я могу это сделать? Я пробовал функцию «Отдельные_строки», но она говорит, что каждый из вложенных столбцов должен иметь одинаковое количество элементов. Мой нет.

## Example1 start
sample_A.1 <- c ("sample_A", "","D","")
sample_A.2 <- c("sample_A", "","D","")    
sample_A.3 <- c("sample_A", "","","red")    
sample_B.1 <- c("sample_B", 28, "", "")
sample_B.2 <- c("sample_B", "", "D", "")
sample_B.3 <- c("sample_B", "", "N", "")
sample_B.4 <- c("sample_B", "", "", "orange")
sample_C.1 <- c("sample_C", 27, "", "")
sample_C.2 <- c("sample_C", 32, "", "")
sample_C.3 <- c("sample_C", "", "E", "")
sample_C.4 <- c("sample_C", "", "", "orange")
sample_C.5 <- c("sample_C", "", "", "yellow")
sample_C.6 <- c("sample_C", "", "", "green")
my.data <- data.frame(rbind(sample_A.1,sample_A.2,sample_A.3,sample_B.1,sample_B.2,sample_B.3,sample_B.4,sample_C.1,sample_C.2,sample_C.3,sample_C.4,sample_C.5,sample_C.6), stringsAsFactors = FALSE)
colnames(my.data) <- c("identifier", "var1", "var2", "var3")

# identifier   var1   var2   var3
# sample_A     30
# sample_A            D
# sample_A                   red
# sample_B     28
# sample_B            D
# sample_B            N
# sample_B                   orange
# sample_C     27
# sample_C     32
# sample_C            E
# sample_C                   orange
# sample_C                   yellow
# sample_C                   green

## Or

## Example2 start
sample_A <- c("sample_A", 30, "D", "red")
sample_B <- c("sample_B", 28, "D, N", "orange")
sample_C <- c("sample_C", "27, 32", "E", "orange, yellow, green")
my.data2 <- data.frame(rbind(sample_A, sample_B, sample_C), stringsAsFactors = FALSE)
colnames(my.data2) <- c("identifier", "var1", "var2", "var3")

# identifier   var1   var2   var3
# sample_A     30     D      red
# sample_B     28     D, N   orange
# sample_C     27, 32 E      orange, yellow, green

Чтобы перейти от Примера 1 к Примеру 2 выше, я использовал следующий код (нужен plyr или dplyr) ...

library(dplyr)
my.data2a <- my.data %>% group_by(identifier) %>%
    summarize_all(funs(paste(.[!is.na(.)], collapse = " ")))
my.data2 <- data.frame(lapply(my.data2a, trimws), stringsAsFactors=FALSE)
my.data2[2:4] <- sapply(my.data2[2:4], gsub, pattern=" ", replacement=", ")

Я попытался использовать следующий код для слияния данных в my.data2 в отдельные строки ... (нужен тидир и тиббл)

data2colnames <- c("var1", "var2", "var3")
my.data2 %>% separate_rows(data2colnames)

Но я получил ошибку: «Ошибка: все вложенные столбцы должны иметь одинаковое количество элементов». Мне нужно перейти к таблице «Конец» в ссылке «Пример вывода» выше, которая в основном выглядит следующим образом:

identifier  var1  var2  var3
sample_A    30    D     red
sample_B.1  28    D     orange
sample_B.2        N
sample_C.1  27    E     orange
sample_C.2  32          yellow
sample_C.3              green

1 Ответ

0 голосов
/ 06 ноября 2018

попробовал что-то безобразное. должно быть что-то красивее.

library(purrr)
df=my.data
df[df==""]=NA

x= df %>% split(.$identifier) %>% map(function(x)sapply(x, function(y)sort(unique(y),dec=T)))
xx=map_dfr(x, function(x){
    mx=max(sapply(x, length))
    z=lapply(x, function(y){
        if(length(y)>0 & startsWith(y[1],"sample")){
            c(y,rep(y[1], mx-length(y)))
        }else
            c(y,rep("", mx-length(y)))
    })  
}) %>% as.data.frame

nm=xx$identifier
xx$identifier = unlist(lapply(split(nm,nm), function(x)if(length(x)>1)paste0(x,".",1:length(x)) else x ))

xx
...