【问题标题】:Using dplyr to gather specific dummy variables使用 dplyr 收集特定的虚拟变量
【发布时间】:2018-10-29 23:17:18
【问题描述】:

这个问题是 (Using dplyr to gather dummy variables) 的扩展。

问题:我怎样才能收集只收集几列,而不是收集整个数据集?所以在这个例子中,我想收集所有的列,但“轿车”除外。我的真实数据集有 250 列,因此如果我可以按名称包含/排除列,那就太好了。

数据集

head(type)
x    convertible coupe hatchback sedan wagon
1           0     0         0     1     0
2           0     1         0     0     0
3           1     0         0     0     0
4           1     0         0     0     0
5           1     0         0     0     0
6           1     0         0     0     0

输出

TypeOfCar
1     x
2     coupe 
3     convertible
4     convertible
5     convertible
6     convertible

【问题讨论】:

  • 聚集前的子集?
  • 是可能的,但这是不希望的,因为它会再次消耗更多内存:-)。应该有办法以整洁的方式做到这一点,对吧?
  • 那你可以试试gather中的value参数吗?
  • 我试过:test % gather(new_column, Count, 2:4) 但结果错误...

标签: r dplyr


【解决方案1】:

不确定我是否理解你,但你可以做你想做的事:

df %>% select(-sedan) %>%  gather(Key, Value)

如果你有很多变量,你可以使用:

select(-contains(""))
select(-start_wi(""))
select(-ends_with(""))

希望对你有帮助。

【讨论】:

  • 谢谢!但是当我在上面的示例中运行它时,结果会略有不同(具有 2 列的数据框)。我尝试在上面的示例中重写您的代码,但这并没有给出预期的结果(因为行被打乱了)。我尝试了什么:xj % select(-sedan) %>% gather(Key, Value)
【解决方案2】:

您可以在gather 中使用-sedan

dat %>% gather(TypeOfCar, Count, -sedan) %>% filter(Count >= 1) %>% select(TypeOfCar)
#      TypeOfCar
# 1 convertible
# 2 convertible
# 3 convertible
# 4 convertible
# 5       coupe

数据:

tt <- "convertible coupe hatchback sedan wagon
1           0     0         0     1     0
2           0     1         0     0     0
3           1     0         0     0     0
4           1     0         0     0     0
5           1     0         0     0     0
6           1     0         0     0     0"

dat <- read.table(text = tt, header = T)

【讨论】:

  • 谢谢!但是我如何使用它来选择例如多个列(假设只收集(敞篷车、轿跑车和掀背车)?(所以选择而不是删除 1 个变量)
  • gather(TypeOfCar, Count, convertible,coupe,hatchback) 适合你吗?
  • 你可以使用这个 sintax 来获得多个连续的列 start_column:end_column 或使用 contains("X") 来匹配一个字符串
  • 我完全误用了这个功能。感谢您的澄清,真的帮助了我!
  • 我看到,经过测试,只显示了名字列名。我应该以特定格式转换我的数据吗?现在是数字。
【解决方案3】:

使用@RLave 和@Carlos Vecina 的组合修复它

right_columns <- all_data %>% select(starts_with("hour"))

all_data$all_hour <-data.frame(new_column = names(right_columns )[as.matrix(right_columns )%*%seq_along(right_columns )],stringsAsFactors=FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 2018-08-22
    • 2021-12-08
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多