新秀问题 - 提前感谢耐心......
我有一个数据框:
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有很大的不同。谢谢。
答案 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
获取一个列表并将该函数应用于列表的每个元素。该列表还可以将另一个列表作为元素。因此需要考虑并返回嵌套结构。