【问题标题】:R: Split Variable Column into multiple (unbalanced) columns by commaR:用逗号将变量列拆分为多个(不平衡)列
【发布时间】:2015-07-23 02:56:40
【问题描述】:

我有一个包含 25 个变量和超过 200 万个观察值的数据集。我的一个变量是几个不同“类别”的组合,我想将它们拆分到每列显示 1 个类别的位置(类似于在 stata 中的拆分)。例如:

# Name      Age     Number               Events                      First 
# Karen      24        8         Triathlon/IM,Marathon,10k,5k         0
# Kurt       39        2         Half-Marathon,10k                    0 
# Leah       18        0                                              1

我希望它看起来像:

# Name   Age  Number Events_1        Event_2      Events_3     Events_4      First
# Karen   24    8     Triathlon/IM    Marathon       10k         5k             0
# Kurt    39    2     Half-Marathon   10k            NA          NA             0 
# Leah    18    0     NA              NA             NA          NA             1

我查看了 stackoverflow,但没有找到任何可行的方法(一切都给了我某种错误)。任何建议将不胜感激。

注意:可能并不重要,但 1 人拥有的最大类别数是 19,因此我需要创建 Event_1:Event_19

评论:以前的堆栈溢出建议使用单独的函数,但是该函数似乎不适用于我的数据集。当我输入函数时程序运行但完成后没有任何改变,没有输出,也没有错误代码。当我尝试使用其他线程中提出的其他建议时,我收到了错误消息。但是,我终于通过使用 cSplit 函数得到了它的工作。感谢您的帮助!!!

【问题讨论】:

标签: r split


【解决方案1】:

来自 Ananda 的splitstackshape 包裹:

cSplit(df, "Events", sep=",")
#    Name Age Number First      Events_1 Events_2 Events_3 Events_4
#1: Karen  24      8     0  Triathlon/IM Marathon      10k       5k
#2:  Kurt  39      2     0 Half-Marathon      10k       NA       NA
#3: Leah   18      0     1            NA       NA       NA       NA

或者tidyr:

separate(df, 'Events', paste("Events", 1:4, sep="_"), sep=",", extra="drop")
#   Name Age Number               Events_1 Events_2 Events_3 Events_4 First
#1 Karen  24      8           Triathlon/IM Marathon      10k       5k     0
#2  Kurt  39      2          Half-Marathon      10k     <NA>     <NA>     0
#3 Leah   18      0                     NA     <NA>     <NA>     <NA>     1

使用data.table 包:

setDT(df)[,paste0("Events_", 1:4) := tstrsplit(Events, ",")][,-"Events", with=F]
#    Name Age Number First               Events_1 Events_2 Events_3 Events_4
#1: Karen  24      8     0           Triathlon/IM Marathon      10k       5k
#2:  Kurt  39      2     0          Half-Marathon      10k       NA       NA
#3: Leah   18      0     1                     NA       NA       NA       NA

数据

df <- structure(list(Name = structure(1:3, .Label = c("Karen", "Kurt", 
"Leah "), class = "factor"), Age = c(24L, 39L, 18L), Number = c(8L, 
2L, 0L), Events = structure(c(3L, 2L, 1L), .Label = c("               NA", 
"         Half-Marathon,10k", "     Triathlon/IM,Marathon,10k,5k"
), class = "factor"), First = c(0L, 0L, 1L)), .Names = c("Name", 
"Age", "Number", "Events", "First"), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • library(data.table); setDT(df)[, paste0('Events', 1:4):= tstrsplit(Events, ',')]
猜你喜欢
  • 2016-10-02
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多