基于列名的字符向量的子集数据帧

时间:2016-05-05 04:39:32

标签: r

新秀问题 - 提前感谢耐心......

我有一个数据框:

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

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

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

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

我想将数据框子集化,以便排除变量中的变量,例如

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

这会产生错误,因为subset需要名称而不是字符。因此,我使用lapply将字符更改为名称:

varnames <- lapply(varnames, as.name)

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

[[1]]
var1

[[2]]
var2

[[3]]
var3

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

我尝试了各种解决方案来取消和取消名称,但没有成功。这一定是我很想念的事情。

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

3 个答案:

答案 0 :(得分:4)

您可以在[内定义所需​​列的名称(有关子集运算符?Extract,请参阅帮助文件help("[")[)。

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阻止它&#39;掉落&#39;如果只有一列返回,则为向量。

另外,如果您查看lapply(X, FUN, ...)

的帮助文件
?lapply
  

lapply返回与X

长度相同的列表

这就是您获取列表的原因。

  

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

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

答案 1 :(得分:1)

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

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


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

答案 2 :(得分:0)

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

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

lapply获取一个列表并将该函数应用于列表的每个元素。该列表还可以将另一个列表作为元素。因此需要考虑并返回嵌套结构。