2015-03-24 5 views
4

Я пытаюсь использовать функцию selectdplyr для извлечения столбцов другой информационной рамки.использовать dplyr для выбора столбцов

Здесь кадр данных:

dput(df1) 
structure(list(Al = c(30245, 38060, 36280, 24355, 27776, 35190, 
38733.8, 36400, 29624, 33699.75), As = c(9, 8.75, 13.5, 7.75, 
7.6, 8.33, 8, 8.75, 7.4, 8.25), Cd = c(0.15, 0.13, 0.15, 0.1, 
0.16, 0.13, 0.24, 0.15, 0.22, 0.13), Cr = c(108.5, 111.75, 104.5, 
81.25, 93.2, 109.75, 105, 104, 87.8, 99.75), Hg = c(0.25, 0.35, 
0.48, 1.03, 1.12, 0.2, 1.14, 0.4, 2, 0.48)), row.names = c(NA, 
10L), class = "data.frame", .Names = c("Al", "As", "Cd", "Cr", 
"Hg")) 

и здесь вектор символов я хочу использовать в качестве фильтра:

dput(vec_fil) 
c("Elemento", "As", "Cd_totale", "Cr_totale", "Cu_totale", "Hg", 
"Ni_totale", "Pb_totale", "Zn_totale", "Composti_organostannici", 
"PCB_totali", "Sommatoria_DDD", "Sommatoria_DDE", "Sommatoria_DDT", 
"Clordano", "Dieldrin", "Endrin", "Esaclorocicloesano", "Eptacloro_epossido", 
"Sommatoria_IPA", "Acenaftene", "Antracene", "Benzo.a.antracene", 
"Benzo.a.pirene", "Crisene", "Dibenzo.ac._.ah.antracene", "Fenantrene", 
"Fluorantene", "Fluorene", "Naftalene", "Pirene") 

Как вы можете видеть vec_fil имеет много символов, которые не соответствуют столбцам от df1, поэтому я получаю эту ошибку:

require("dplyr") 
df2 <- select(df1, one_of(vec_fil)) 
Error: Each argument must yield either positive or negative integers 

Любой намек, который я могу использовать для получения o nly согласованный символ вектора фильтра в новом кадре данных?

+1

Привет, непонятно, что вы хотите сделать или результат, которого вы ожидаете, и откуда приходит 'one_of'? Возможно, что вы пытаетесь сделать, это 'df1 [, names (df1)% in% vec_fil]'. –

+0

Привет, да .. то, что вы написали, это то, что я ожидал .. Можно ли сделать то же самое с 'dplyr'? – matteo

+2

Вы можете сделать что-то смешное, как 'select (df1, matches (paste (vec_fil, collapse =" | ")))', но я просто не понимаю, почему бы не использовать базу R в этой ситуации. –

ответ

5

вы можете попробовать этот код в базе R

df1[, names(df1) %in% vec_fil] 

и если вы хотите использовать пакет dplyr

select(df1, which(names(df1) %in% vec_fil)) 
2

Просто избавиться от имен переменных, не включенных в кадре данных с помощью intersect:

select(df1, one_of(intersect(vec_fil, names(df1)))) 
+0

Отличное решение, спасибо! – matteo

4

Я опаздываю на вечеринку. Но никто не объясняет, в чем причина ошибки. Итак, да.

Вы ошибочно использовали one_of() в пакете dplyr. Согласно документации пакета, он выбирает [все] переменные, которые находятся в векторе.

one_of("x", "y", "z"): selects variables provided in a character vector.

Это не позволяет вам выбрать подмножество переменных из one_of() вектора, хотя название этой функции следует, что.

В вашем случае, vec_fil вектор имеет некоторые имена функций, которых нет в кадре данных. Таким образом, он вызывает ошибку. Вы должны использовать только one_of(), если у вас длинный список имен функций, и вы не хотите вводить их вручную. Таким образом, вы можете прочитать их непосредственно из списка.

Надеюсь, это поможет вам в ваших будущих работах.

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