问题:
我有一个特殊的问题,我想按列对给定的数据框进行子集化,其中列名存储在另一个数据框中。
使用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")]
答案 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
#....