【问题标题】:Subset data frame based on character vector of column names [duplicate]基于列名字符向量的子集数据框[重复]
【发布时间】:2016-05-05 04:39:31
【问题描述】:

菜鸟问题 - 提前感谢您的耐心...

我有一个数据框:

vals <- c(1,1,1,1)
testdf <- data.frame("var1"=vals, "var2"=vals, "var3"=vals)

我有一个变量名的字符向量:

varnames <- c("var1", "var2")

这是一个字符向量 b/c 我用它在脚本前面生成一个公式。

我想对数据框进行子集化,以便排除 varnames 中的变量,例如

newDF <- subset(df, select=-varnames)

这会产生错误,因为subset 需要名称而不是字符。所以,我用lapply把字符改成名字:

varnames <- lapply(varnames, as.name)

这个 lapply 函数的结果是一个命名 (?) 和嵌套 (?) 列表。

[[1]]
var1

[[2]]
var2

[[3]]
var3

这就是我迷路的地方(我觉得 Mugatu 服用了疯狂的药丸……这会让其他人感到困惑吗!?)。我可以看到每个值都已正确地从字符更改为名称,但它位于这个奇怪的嵌套结构中 - 所以当我尝试子集时,我得到一个错误。

我尝试了各种解决 unnest 和 unname 的方法,但都没有成功。这一定是我想念的容易的东西。

作为奖励 - 有人能告诉我为什么 lapply 返回这个嵌套的命名列表而不是简单的向量很有用吗?例如,它似乎与 Python 非常不同。谢谢。

【问题讨论】:

标签: r


【解决方案1】:

您可以在[ 中定义所需列的名称(请参阅帮助文件?Extracthelp("[") 以了解子集运算符[)。

testdf[ names(testdf)[!names(testdf) %in% varnames] ]
## or
## testdf[, names(testdf)[!names(testdf) %in% varnames] , drop = FALSE]

或者,更简洁(感谢@Frank)

testdf[ setdiff(names(testdf), varnames)]
  var3
1    1
2    1
3    1
4    1

在哪里

names(testdf)
# [1] "var1" "var2" "var3"
varnames
# [1] "var1" "var2"

所以

names(testdf) %in% varnames
# [1]  TRUE  TRUE FALSE

因此

names(testdf)[!names(testdf) %in% varnames]
# [1] "var3"

与此相同

testdf[, "var3" ]

如果只返回一列,drop = FALSE 会阻止它“下降”到向量中。


另外,如果您查看lapply(X, FUN, ...) 的帮助文件

?lapply

lapply 返回一个与 X 长度相同的列表

这就是你得到一个列表的原因。


作为奖励 - 有人能告诉我为什么 lapply 返回这个嵌套的命名列表而不是简单的向量很有用吗?例如,它似乎与 Python 非常不同。谢谢。

当您使用列表时,您希望它保留为列表。

【讨论】:

  • 仅供参考,x[!(x %in% y)]setdiff(x,y)
  • 太棒了!效果很好。感谢 Symbolix 和 @Frank
【解决方案2】:

您也可以使用返回索引的match

testdf[-match(varnames,names(testdf))]


#   var3
#1    1
#2    1
#3    1
#4    1

【讨论】:

    【解决方案3】:

    您可以使用varnames[[1]] 等访问元素并将其转换为矢量,如果它对您来说更容易的话。

    来源:https://www.datacamp.com/community/tutorials/r-tutorial-apply-family

    lapply 接受一个列表并将函数应用于列表的每个元素。该列表还可以有另一个列表作为元素。因此它会考虑到这一点并返回该嵌套结构。

    【讨论】:

    • 更好的来源是help("[[")。通常,此站点上不首选链接,因为它们最终可能会断开。
    • 嗨。我在这里比较新。我没有得到你。我应该使用什么来代替链接?
    • 哦,你的意思是建议在 R 中使用帮助功能。知道了 :)
    猜你喜欢
    • 2014-03-07
    • 2015-01-24
    • 2019-12-24
    • 1970-01-01
    • 2020-08-24
    • 2017-01-22
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多