2016-07-24 1 views
-1

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

id name     grade 
1 rich, tom, todd,  12 
2 chris,mary   9 
3 larry    10 

Я бег следующего кода, чтобы разбить текст на колонки:

newdf <- within(df, name<-data.frame(do.call('rbind', strsplit(as.character(name), ',', fixed=TRUE)))) 

А вот мой выход:

id name.X1 name.X2 name.X3 grade 
1 rich  tom  todd  12 
2 chris  mary  chris  9 
3 larry  larry  larry  10 

код у меня повторяют имена (в идентификаторе 2 & 3), в отличие от ввода в заготовках или NA. То, что я хотел бы код для вывода является следующее:

id name.X1 name.X2 name.X3 grade 
    1  rich  tom  todd  12 
    2  chris  mary  N/A  9 
    3  larry  N/A  N/A  10 

Или вместо N/A Я хотел бы для ячеек быть оставлено пустым. Любая идея, как я могу избежать повторения имен? Спасибо.

ответ

2

Мы можем использовать cSplit из splitstackshape

library(splitstackshape) 
cSplit(df, "name", ",") 
# id grade name_1 name_2 name_3 
#1: 1 12 rich tom todd 
#2: 2  9 chris mary  NA 
#3: 3 10 larry  NA  NA 

Если мы используем strsplit, как list элементы имеют разную длину, она может быть лучше раздуть НСБУ или иначе элементы получают повторен. Для заполнения с NA в конце один из вариантов состоит в том, чтобы получить length каждого из элемента list, который можно сделать с помощью lengths, возьмите max ('mx') и назначьте length в «mx». Затем мы просто создаем новые столбцы на «df» на основе «mx».

lst <- strsplit(as.character(df$name), ",\\s*") 
mx <- max(lengths(lst)) 
df[paste0("name", seq(mx))] <- lapply(lst, `length<-`, mx) 
df[setdiff(names(df), "name")] 
# id grade name1 name2 name3 
#1 1 12 rich chris larry 
#2 2  9 tom mary <NA> 
#3 3 10 todd <NA> <NA> 
+0

@ZheyuanLi 'NAME_3: Фактор ж/1 уровень "Todd": 1 Н.А. NA' – akrun

+1

@ZheyuanLi Да потому, что в предыдущем случае, столбцы возвращаются как' factor' в качестве исходного столбца 'Name', но в 'strsplit', это будут столбцы' character'. – akrun

+0

@ ZheyuanLi Я полагаю, что для «фактора» NA может быть «NA_integer_» – akrun

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