2016-10-14 2 views
0

У меня есть фрейм данных с этой структурой:Разбиение строки и укладки их в одном столбце

> df 
modifications 
13-MOD:0057 
13-MOD:0046 
13-MOD:0051,13-MOD:0076 
13-MOD:0036,13-MOD:0076,13-MOD:0016 
13-MOD:0256,13-MOD:0156,13-MOD:0956,13-MOD:0125 
13-MOD:0014 13-MOD:0156, 13-MOD:0956,13-MOD:0125...n 
13-MOD:0012 ... n 

Чтобы расколоть данные я использовал этот код:

df2 <- data.frame(str_split_fixed(df$modifications, ",", 20)) 

В принципе, я получаю это данные.

> df2 
x1   | x2   | x3   | empty  | 
13-MOD:0057 | empty  | empty  | empty  | 
13-MOD:0046 | emply  | empty  | empty  | 
13-MOD:0051 | 13-MOD:0076 | empty  | empty  | 
13-MOD:0036 | 13-MOD:0076 | 13-MOD:0016 | empty  | 
13-MOD:0256 | 13-MOD:0156 | 13-MOD:0956 | 13-MOD:0125 
13-MOD:0014 | 13-MOD:0156 | 13-MOD:0956 | 13-MOD:0125 | ... n 
13-MOD:0012 | ...   | ...n 

Что я хочу удалить пустые значения и складывать данные из столбцов X2, X3, X4 ... п к первому X1.

Для этого я использую это:

df3 <- melt(setDT(df2),      # set df to a data.table 
measure.vars = list(c(1:20)), # set column groupings 
value.name = 'V')[      # set output name scheme 
    , -1, with = F] 

Чтобы удалить пустые значения:

df3[df3==""] <- NA 

histo3 = подмножество (! DF3, V1 = 'NA')

Но Я не знаю, почему я получаю ошибку о длине столбца в функции расплава. Знаете ли вы, какой способ сделать это проще?

Возпроизводимо пример:

df <- data.frame(modifications=c("UNIMOD:108,UNIMOD:108","UNIMOD:108","UNIMOD:108","UNIMOD:108,UNIMOD:108,UNIMOD:108","UNIMOD:108,UNIMOD:108,UNIMOD:108,UNIMOD:108,UNIMOD:108,UNIMOD:108","UNIMOD:108")) 
+0

'read.table (текст = as.character (DF $ модификациями), заполняют = TRUE, то sep = ',') ' – rawr

+0

@rawr'Error в read.table (text = as.character (histo1 $ изменения), fill = TRUE,: duplicate 'row.names' не разрешены – Enrique

+0

Я не получаю эту ошибку, попробуйте добавить row.names = NULL? – rawr

ответ

1

это может быть что-то вроде этого?

library(stringr) 

# input dataset 
s <- c('13-MOD:0057', '13-MOD:0046', '13-MOD:0051,13-MOD:0076', '13-MOD:0036,13-MOD:0076,13-MOD:0016', '13-MOD:0256,13-MOD:0156,13-MOD:0956,13-MOD:0125') 

s 
[1] "13-MOD:0057"          
[2] "13-MOD:0046"          
[3] "13-MOD:0051,13-MOD:0076"       
[4] "13-MOD:0036,13-MOD:0076,13-MOD:0016"    
[5] "13-MOD:0256,13-MOD:0156,13-MOD:0956,13-MOD:0125" 

# get the individual lengths 
lengths <- sapply(str_split(s,','), function(x){ length(x) }) 

# create the dataframe splitting in N columns 
as.data.frame(str_split_fixed(s, ',', max(lengths))) 

    V1   V2   V3   V4 
1 13-MOD:0057          
2 13-MOD:0046          
3 13-MOD:0051 13-MOD:0076       
4 13-MOD:0036 13-MOD:0076 13-MOD:0016    
5 13-MOD:0256 13-MOD:0156 13-MOD:0956 13-MOD:0125 

ОБНОВЛЕНИЕ 1 Для того, чтобы сложить все не пустые ячейки в одном столбце

# create the dataframe splitting in N columns 
first.matrix <- str_split_fixed(s, ',', max(lengths)) 

# select only the cells != "" 
first.matrix[which(first.matrix!="")] 

[1] "13-MOD:0057" "13-MOD:0046" "13-MOD:0051" "13-MOD:0036" "13-MOD:0256" "13-MOD:0076" 
[7] "13-MOD:0076" "13-MOD:0156" "13-MOD:0016" "13-MOD:0956" "13-MOD:0125" 
+0

Nop. Я хочу собрать все из них в один столбец. – Enrique

Смежные вопросы