【问题标题】:split dataframe column containing a string of comma separated values into multiple columns将包含一串逗号分隔值的数据框列拆分为多列
【发布时间】:2019-06-22 06:19:12
【问题描述】:

我有一个类似于以下内容的数据框列:

ColA
""
"1"
"1,9"
"9,19"
"1,9,19"

数据框中有数百行,数字 1-30 可以出现在逗号分隔的列表中。我想将这些值分隔到它们自己的列中,并用布尔值指示该数字是否存在。

colA_1  colA_9  colA_19

1       0       0                    
1       1       0
0       1       1
1       1       1

例如,我知道使用 grepl("[1][9]",df$ColA) 将获取所需的行,然后我可以使用它为数字 19 创建一个新列,但我无法弄清楚获取单个的正则表达式是什么数字数字(例如 1)而不抓取其他数字(例如 11 或 21)。我承认我对正则表达式不是很熟悉,而且通常不需要使用它们。但是我的几次谷歌搜索都是徒劳的。

如果它只是一个字符串,unliststrsplit 的组合就可以解决问题,但我不知道如何在不迭代行的情况下将其应用于数据帧的整个列。

我想学习一个不使用循环的解决方案,它可以使用正则表达式或任何可以完成工作的东西。

【问题讨论】:

  • 试试table(stack(setNames(strsplit(df1$ColA, ","), seq_len(nrow(df1))))[2:1])
  • 就可以了。我需要仔细检查并确保我理解它的工作原理,但感谢您的解决方案!

标签: r


【解决方案1】:

这是一个 tidyverse 解决方案。 seperate 调用会给你一个警告,但除此之外它工作正常:

library(tidyverse)
df <- tibble(ColA = c("", "1", "1,9", "9,19", "1,9,19"))

df1 <- df %>% 
  mutate(n = row_number()) %>% 
  separate(ColA, into = str_c("ColA", 1:30)) %>% 
  gather(key, value, -n) %>% 
  filter(!is.na(value), value != "") %>% 
  mutate(
    key = str_c(str_sub(key, 1, 4), value),
    value2 = 1
  ) %>%
  select(-value) %>% 
  spread(key, value2)

## replace missings
df1[is.na(df1)] <- 0

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多