Подмножество фрейма данных, используя имена из другого фрейма данных - PullRequest
0 голосов
/ 13 ноября 2018

Вопрос:

У меня есть особая проблема, когда я хочу поместить столбец данных в отдельный столбец, где имена столбцов хранятся в другом кадре данных.

Пример использования набора данных mtcars:

options(stringsAsFactors = FALSE)

col_names <- c("hp,disp", "disp,hp,mpg")
df_col_names <- as.data.frame(col_names)

vec <- df_col_names[1,] # first row contains "hp" and "disp"
mtcars_new <- mtcars[, c("hp", "disp")] ## assuming that vec gives colnames

Я даже пытался вставить двойные кавычки в каждое из слов, используя следующее:

Попытка решения:

options(stringsAsFactors = FALSE)

col_names <- c("hp,disp", "disp,hp,mpg")
df_col_names <- as.data.frame(col_names)

df_col_names$col_names <- gsub("(\\w+)", '"\\1"', df_col_names$col_names)
vec <- df_col_names[1,]
vec2 <- gsub("(\\w+)", '"\\1"', vec)

mtcars_new <- mtcars[,vec2] ## this should be same as mtcars[, c("hp", "disp")]

Ожидаемое решение

mtcars_new <- mtcars[,vec2] равно mtcars_new <- mtcars[, c("hp", "disp")]

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вот еще один способ сделать это:

col_names <- c("hp,disp", "disp,hp,mpg")

vec2 <- unlist(str_split(col_names[[1]],','))
mtcars_new <- mtcars[,vec2]

Что вы делаете, это выбираете первый элемент из вектора col_names, разделяете его по разделителю, затем распечатываете его (поскольку str_split () составляет список), затем вы используете свой новый вектор имен для подмножества фрейм данных mtcars.

0 голосов
/ 13 ноября 2018

Вам это нужно?

lapply(strsplit(as.character(df_col_names$col_names), ","), function(x) mtcars[x])

#[[1]]
#                     hp  disp
#Mazda RX4           110 160.0
#Mazda RX4 Wag       110 160.0
#Datsun 710           93 108.0
#Hornet 4 Drive      110 258.0
#Hornet Sportabout   175 360.0
#.....

#[[2]]
#                     disp  hp  mpg
#Mazda RX4           160.0 110 21.0
#Mazda RX4 Wag       160.0 110 21.0
#Datsun 710          108.0  93 22.8
#Hornet 4 Drive      258.0 110 21.4
#Hornet Sportabout   360.0 175 18.7
#....

Здесь мы разбиваем имена столбцов на запятую (","), а затем подставляем их из кадра данных, используя lapply.Это возвращает список фреймов данных с длиной списка, равной количеству строк в фрейме данных.


Если вы хотите создать подмножество только первой строки, вы можете сделать

mtcars[strsplit(as.character(df_col_names$col_names[1]), ",")[[1]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...