【问题标题】:Move same factor levels in different columns into same column in R将不同列中的相同因子水平移动到 R 中的同一列中
【发布时间】:2018-07-15 15:25:04
【问题描述】:

我有一个包含不同变量的数据框,这些变量可以共享一些因子水平:

      id     tag_1      tag_2      tag_3
1:    3      human      NA         artist
2:    5      human      NA         NA
3:    7      song       artist     human
4:    8      town       human      NA   

如您所见,“人类”级别存在于三个不同的变量(tag_1、tag_2 和 tag_3)中,而“艺术家”级别存在于两个变量(tag_2 和 tag_3)中。

知道给定行中的每个因子级别都是唯一的,我想将相同的级别分组到同一列中,以便在每列中具有专有的因子级别:

      id     tag_1      tag_2      tag_3
1:    3      human      NA         artist
2:    5      human      NA         NA
3:    7      human      song       artist
4:    8      human      town       NA  

有没有办法做到这一点?

如果不是,另一种方法是按出现次数(所有数据框中的出现次数)对每行中的级别进行排序...

感谢您的任何绝妙主意!

【问题讨论】:

  • 你想要的输出有错误吗?

标签: r dataframe reshape levels


【解决方案1】:

我会这样做:

library(data.table)
melt(setDT(mydf), "id", na.rm = TRUE)[
  , dcast(.SD, id ~ value, value.var = "value")]
#    id artist human song town
# 1:  3 artist human   NA   NA
# 2:  5     NA human   NA   NA
# 3:  7 artist human song   NA
# 4:  8     NA human   NA town

如果您确实需要将列采用“tag_number”格式,则可以轻松重命名这些列。

或者,只需创建一个二元指标:

melt(setDT(mydf), "id", na.rm = TRUE)[
  , dcast(.SD, id ~ value, value.var = "variable", fun = length, fill = 0)]
#    id artist human song town
# 1:  3      1     1    0    0
# 2:  5      0     1    0    0
# 3:  7      1     1    1    0
# 4:  8      0     1    0    1

“tidyverse”中的相似之处是:

library(tidyverse)
mydf %>% 
  gather(key, val, -id, na.rm = TRUE) %>% 
  select(-key) %>% 
  spread(val, val)

mydf %>% 
  gather(key, val, -id, na.rm = TRUE) %>% 
  select(-key) %>% 
  mutate(value = 1) %>% 
  spread(val, value, fill = 0)

【讨论】:

  • 感谢 A5C1D2H2I1M1N2O1R2T1,有趣的方式,但问题是我有将近 10k 个不同的级别,我不想有 10k 个不同的变量。正如您已经猜到的那样,目标是进行多标签分类,但对我而言,单热编码太重了。我想限制为 30 个变量(每个变量有数百个级别),然后对每个组合进行 32 位二进制编码......(但仍在考虑其他解决方案)
猜你喜欢
  • 2021-04-15
  • 2016-06-06
  • 2022-08-17
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2019-02-07
  • 2021-09-12
相关资源
最近更新 更多