当前位置: 首页 > 知识库问答 >
问题:

使用$和一个字符值动态选择数据帧列

东方建修
2023-03-14
cols <- c("mpg", "cyl", "am")
col <- cols[1]
col
# [1] "mpg"

mtcars$col
# NULL
mtcars$cols[1]
# NULL
mtcars$mpg
for(x in seq_along(cols)) {
   value <- mtcars[ order(mtcars$cols[x]), ]
}

共有1个答案

李经国
2023-03-14

不能用$做这种子集。在源代码(r/src/main/subset.c)中,它声明:

/*$subset运算符
我们需要确保只计算第一个参数。
第二个将是一个需要匹配而不是计算的符号。
*/

第二个论点?什么?!您必须意识到$与R中的其他内容一样(例如(+^等)是一个函数,它接受参数并进行计算。DF$v1可以重写为

`$`(df , V1)

或者确实如此

`$`(df , "V1")

但是...

`$`(df , paste0("V1") )

...永远不会起作用,在第二个参数中必须首先计算的其他任何东西也不会起作用。只能传递从不求值的字符串。

var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
#  set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )

#  We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")

#  Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
#  to pass to the first argument, in this case 'order'.
#  Since  a data.frame is really a list, we just subset the data.frame
#  according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ]  ) , ]

   col1 col2 col3
10    3    5    1
9     3    2    2
7     3    2    3
8     5    1    3
6     1    5    4
3     3    4    4
2     4    3    4
5     5    1    4
1     2    5    5
4     5    3    5
 类似资料: