使用来自另一个数据框的别名对数据框进行子集

时间:2018-11-13 10:47:27

标签: r dataframe

问题:

我有一个特殊的问题,我想按列对给定的数据框进行子集化,其中列名存储在另一个数据框中。

使用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 :(得分:2)

这是另一种方法:

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

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

您正在做的是从col_names向量中选取第一个元素,用分隔符将其分割,然后将其取消列出(因为str_split()会列出一个列表),然后您将使用新的名称向量来子集mtcars数据帧。

答案 1 :(得分:0)

您需要这个吗?

"lastDialogIntent":"BuyCarIntent"

在这里,我们在逗号(“,”)上拆分列名称,然后使用public enum Month { January(1), February(2), March(3), April(4),May(5),June(6), July(7), August(8), September(9), October(10), November(11), December(12) } 从数据框中将其子集化。这将返回一个数据帧列表,其列表长度与数据帧中的行数相同。


如果只想对第一行进行子集化,则可以

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
#....