gpt4 book ai didi

r - 使用gather时保留多列

转载 作者:行者123 更新时间:2023-12-04 22:58:20 24 4
gpt4 key购买 nike

我有一个非常宽的 df(85 列),我想使用 gather 将其转换为长格式.而不是使用 -c(all the columns I do not want to gather)保留列的语法,我创建了一个列名对象并得到错误。

Error in -c(KeepThese) : invalid argument to unary operator

例如,使用 iris有一些额外的字段
require(tidyr)
iris$Season <- sample(c("AAA", "BBB"), nrow(iris), replace = T)
iris$Var <- sample(c("CCC", "DDD"), nrow(iris), replace = T)

> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Season Var
1 5.1 3.5 1.4 0.2 setosa AAA DDD
2 4.9 3.0 1.4 0.2 setosa AAA CCC
3 4.7 3.2 1.3 0.2 setosa BBB CCC
4 4.6 3.1 1.5 0.2 setosa BBB CCC
5 5.0 3.6 1.4 0.2 setosa BBB DDD
6 5.4 3.9 1.7 0.4 setosa AAA DDD

我想收集除 5:7 之外的所有列,它们被制成下面的对象。
KeepThese <- colnames(iris)[5:7]

现在,我要 gather除 5:7 之外的所有列并调用 ID 列 Part 和数字字段 Value 并使用以下代码并获取错误。
dat <- iris %>% gather(Part, Value, -c(KeepThese))


Error in -c(KeepNames) : invalid argument to unary operator

如何指定一堆我不想收集的列而不在 tidyr 中写出每一列?

附加 为什么我的代码不起作用?

最佳答案

更新答案:正如 Hadley 在评论中所指出的,one_of()是你想要的。

dat <- iris %>% gather(Part, Value, -one_of(KeepThese))

原答案:

另一种选择是使用 as.name() .我们可以根据要保留的列名称创建名称分类对象列表。然后使用 do.call(c, ...)将其插入 gather() .
dat <- iris %>% gather(Part, Value, -do.call("c", lapply(KeepThese, as.name)))
head(dat)
# Species Season Var Part Value
# 1 setosa AAA CCC Sepal.Length 5.1
# 2 setosa AAA CCC Sepal.Length 4.9
# 3 setosa AAA DDD Sepal.Length 4.7
# 4 setosa AAA CCC Sepal.Length 4.6
# 5 setosa AAA CCC Sepal.Length 5.0
# 6 setosa AAA DDD Sepal.Length 5.4

或者,一个简单的 %in%which()也会这样做(与 jbaums 的回答非常相似)。
iris %>% gather(Part, Value, -which(names(.) %in% KeepThese))

关于r - 使用gather时保留多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34686205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com