2016-08-22 2 views
0

Привет У меня есть фреймворк данных, который содержит несколько значений в виде списка для некоторых строк.R unlisting вложенные значения строк

var1 
A8 
A9 
c("A1", "A1", "D3") 
c("A1", "D1") 
c("D1", "D1") 
c("D2", "A2") 
c("D5", "A1") 

Я пытаюсь «перечислить» строки с несколькими значениями, сохранив первое наблюдение. Я без всякой удачи играл с командой unlist. Каков самый простой способ выполнить эту задачу.

+1

Не могли бы вы предоставить 'dput (head (df))'? –

+0

Если это произошло из чтения в файле с оборванным количеством столбцов, вернемся к команде 'read.csv()' и, пожалуйста, 'dput()' us заголовок файла + первые несколько строк. – smci

+0

Структура (список (Var1 = структура (1: 6, .Label = c ("", "B1", "B2", "B3", "B4", "B5", "B6", "B7" "B8", "c (\" B1 \ ", \" B1 \ ")", "c (\" B3 \ ", \" B4 \ ")", "c (\" B4 \ ", \" B2 \ ")"), class = "factor"), Freq = c (2538L, 633L, 458L, 328L, 135L, 56L)), .Names = c ("Var1", "Freq"), row.names = c (NA, 6L), class = "data.frame") – rrodrigorn0

ответ

0

Как указано в комментарии, столбец должен быть первым принуждают (в пересчете) в классе character от тока factor класса с помощью as.character.

Этого можно избежать на этапе чтения файла с помощью параметра stringsAsFactors=FALSE

Нарезки каждой строку и сохраняя только первое значение может быть сделано с:

copyDF$Var1 = sapply(strsplit(copyDF$Var1,","),head,1)

Дайте нам знать, если это работает:

#user input data with factor class 
userDF = structure(list(Var1 = structure(1:6, .Label = c("", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "c(\"B1\", \"B1\")", "c(\"B3\", \"B4\")", "c(\"B4\", \"B2\")"), class = "factor"), Freq = c(2538L, 633L, 458L, 328L, 135L, 56L)), .Names = c("Var1", "Freq"), row.names = c(NA, 6L), class = "data.frame") 
userDF 
# Var1 Freq 
#1  2538 
#2 B1 633 
#3 B2 458 
#4 B3 328 
#5 B4 135 
#6 B5 56 

str(userDF) 
# 'data.frame': 6 obs. of 2 variables: 
#$ Var1: Factor w/ 12 levels "","B1","B2","B3",..: 1 2 3 4 5 6 
#$ Freq: int 2538 633 458 328 135 56 

#Since userDF had no multiple values, adding them here 
newDF = structure(list(Var1 = structure(1:6, .Label = c("B1,B2,B3", "B4,B5", "B6,B7,B8", "B3", "B4", "B5", "B6", "B7", "B8", "c(\"B1\", \"B1\")", "c(\"B3\", \"B4\")", "c(\"B4\", \"B2\")"), class = "factor"), Freq = c(2538L, 633L, 458L, 328L, 135L, 56L)), .Names = c("Var1", "Freq"), row.names = c(NA, 6L), class = "data.frame") 
newDF 
#  Var1 Freq 
#1 B1,B2,B3 2538 
#2 B4,B5 633 
#3 B6,B7,B8 458 
#4  B3 328 
#5  B4 135 
#6  B5 56 


#Make a copy of the dataset 
copyDF = newDF 

#Var1 is of class factor which is not amenable for string operations,hence convert to character class 
copyDF$Var1 = as.character(copyDF$Var1) 

#Split each row, unlist and retain only first value 

copyDF$Var1 = sapply(strsplit(copyDF$Var1,","),head,1) 

copyDF 
# Var1 Freq 
#1 B1 2538 
#2 B4 633 
#3 B6 458 
#4 B3 328 
#5 B4 135 
#6 B5 56 
Смежные вопросы