2013-04-28 3 views
0

У меня есть список столбцов, которые я хочу объединить в вектор. Элементом столбца может быть имя или строка «0». Я хотел бы получить список элементов столбца, которые имеют имя в вектор символов, который называется df$keywords. Я вставил примерный кадр данных ниже. Я хотел бы, чтобы он сталобъединение столбцов в R

df$keywords[1,] будет пустой вектор

df$keywords[2,] будет (ACT Science, study skills, MCAT)

Любая помощь будет высоко

structure(list(V31 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = "0", class = "factor"), V32 = structure(c(1L, 
    2L, 4L, 5L, 7L, 8L, 6L, 5L, 3L, 3L), .Label = c("0", "ACT Science", 
    "English", "Microsoft PowerPoint", "physics", "proofreading", 
    "reading", "writing"), class = "factor"), V33 = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "0", class = "factor"), 
    V34 = structure(c(1L, 7L, 5L, 5L, 8L, 2L, 6L, 5L, 3L, 4L), .Label = c("0", 
    "geography", "Italian", "literature", "prealgebra", "SAT reading", 
    "study skills", "trigonometry"), class = "factor"), V35 = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "0", class = "factor"), 
    V36 = structure(c(1L, 3L, 4L, 4L, 7L, 2L, 6L, 4L, 5L, 5L), .Label = c("0", 
    "English", "MCAT", "precalculus", "proofreading", "SAT writing", 
    "writing"), class = "factor"), V37 = structure(c(1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "0", class = "factor"), 
    V38 = structure(c(1L, 1L, 5L, 5L, 2L, 1L, 4L, 5L, 3L, 6L), .Label = c("0", 
    "English", "GED", "physical science", "reading", "spelling" 
    ), class = "factor")), .Names = c("V31", "V32", "V33", "V34", 
    "V35", "V36", "V37", "V38"), class = "data.frame", row.names = c(NA, 
    -10L)) 
+1

привет, извините, но это не делает слишком много смысла. То, что вы описываете как результат, не совпадает с образцами данных. Кроме того, вы хотите объединить их в «вектор» или в «data.frame»? Пожалуйста, подумайте над тем, чтобы уточнить свой вопрос для ясности. –

ответ

3

Предполагая, что ваши данные в присваивается x, то следующее, что вы думаете, следующее:

apply(x, 1, function(r) {tmp <- unique(r); tmp[tmp != 0]}) 

apply работает через каждую строку вашего кадра данных, принимает уникальные элементы в каждой строке и избавляются от 0 записей. Результаты представляют собой список векторов различной длины с уникальными ненулевыми элементами каждой строки.

+0

Маленькая опечатка: 'apply (x' должно быть' apply (tmp' Я думаю? – SlowLearner

+3

более компактным способом записи будет «apply (df, 1, function (r) unique (r [r! = 0])) ' –

+0

@SlowLearner no typo !!' x' - это объект, который «применил» эту функцию. Чтобы быть применимым к данным OP, это должно быть «apply (df ...)», но я думаю, что sean дает общий case. –

1

В первом посте я не правильно понимаю требуемую мощность, А немного другой подход будет использовать оператор %in% по строкам, как это:

df$keywords <- apply(df,1, function(x) c(x[! x %in% "0"])) 
df$keywords 
#                           keywords 
#1                              
#2             ACT Science, study skills, MCAT, ACT Science, study skills, MCAT 
#3  Microsoft PowerPoint, prealgebra, precalculus, reading, Microsoft PowerPoint, prealgebra, precalculus, reading 
#4        physics, prealgebra, precalculus, reading, physics, prealgebra, precalculus, reading 
#5         reading, trigonometry, writing, English, reading, trigonometry, writing, English 
#6               writing, geography, English, writing, geography, English 
#7 proofreading, SAT reading, SAT writing, physical science, proofreading, SAT reading, SAT writing, physical science 
#8        physics, prealgebra, precalculus, reading, physics, prealgebra, precalculus, reading 
#9           English, Italian, proofreading, GED, English, Italian, proofreading, GED 
#10       English, literature, proofreading, spelling, English, literature, proofreading, spelling 

И если вы хотите unique набор навыков в строку, просто добавьте в команде unique следующим образом:

df$keywords <- apply(df,1, function(x) c(unique(x[ ! x %in% "0" ]))) 
df["keywords"] 
#             keywords 
#1               
#2       ACT Science, study skills, MCAT 
#3 Microsoft PowerPoint, prealgebra, precalculus, reading 
#4     physics, prealgebra, precalculus, reading 
#5     reading, trigonometry, writing, English 
#6        writing, geography, English 
#7 proofreading, SAT reading, SAT writing, physical science 
#8     physics, prealgebra, precalculus, reading 
#9      English, Italian, proofreading, GED 
#10    English, literature, proofreading, spelling 
Смежные вопросы