首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据值将逗号分隔的数字列拆分为多列

根据值将逗号分隔的数字列拆分为多列
EN

Stack Overflow用户
提问于 2018-06-02 03:46:32
回答 2查看 796关注 0票数 2

我的数据框中有一个列f,我希望根据该列中的值将其分布到多个列中。例如:

代码语言:javascript
复制
df <- structure(list(f = c(NA, "18,17,10", "12,8", "17,11,6", "18", 
                           "12", "12", NA, "17,11", "12")), .Names = "f", row.names = c(NA, 
                                                                                        10L), class = "data.frame")

df
#            f
#  1      <NA>
#  2  18,17,10
#  3      12,8
#  4   17,11,6
#  5        18
#  6        12
#  7        12
#  8      <NA>
#  9     17,11
#  10       12

如何将列f拆分为多个列,以指示行中的数字。我对这样的东西很感兴趣:

代码语言:javascript
复制
          6    8    10   11   12   17   18    
1         0    0    0    0    0    0    0
2         0    0    1    0    0    1    1
3         0    1    0    0    1    0    0
4         1    0    0    1    0    1    0
5         0    0    0    0    0    0    1
6         0    0    0    0    1    0    0
7         0    0    0    0    1    0    0
8         0    0    0    0    0    0    0
9         0    0    0    1    0    1    0
10        0    0    0    0    1    0    0

我想我可以在f列上使用unique根据不同的数字创建单独的列,然后执行grepl来确定特定的数字是否在列f中,但我想知道是否有更好的方法。类似于tidyr包中的spreadseparate

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-02 04:30:48

使用tidyr::separate_rows的解决方案如下所示:

代码语言:javascript
复制
library(tidyverse)
df %>% mutate(ind = row_number()) %>%
  separate_rows(f, sep=",") %>%
  mutate(f = ifelse(is.na(f),0, f)) %>%
  count(ind, f) %>%
  spread(f, n, fill = 0) %>%
  select(-2) %>% as.data.frame()

   # ind 10 11 12 17 18 6 8
# 1    1  0  0  0  0  0 0 0
# 2    2  1  0  0  1  1 0 0
# 3    3  0  0  1  0  0 0 1
# 4    4  0  1  0  1  0 1 0
# 5    5  0  0  0  0  1 0 0
# 6    6  0  0  1  0  0 0 0
# 7    7  0  0  1  0  0 0 0
# 8    8  0  0  0  0  0 0 0
# 9    9  0  1  0  1  0 0 0
# 10  10  0  0  1  0  0 0 0
票数 3
EN

Stack Overflow用户

发布于 2018-06-02 04:01:02

这可以通过以下方式来实现:在,上进行split,将其stack到一个两列的data.frame,并使用table获得频率

代码语言:javascript
复制
df1 <- na.omit(stack(setNames(lapply(strsplit(df$f, ","), 
          as.numeric), seq_len(nrow(df))))[, 2:1])
table(df1)
#  values
#ind  6 8 10 11 12 17 18
#  1  0 0  0  0  0  0  0
#  2  0 0  1  0  0  1  1
#  3  0 1  0  0  1  0  0
#  4  1 0  0  1  0  1  0
#  5  0 0  0  0  0  0  1
#  6  0 0  0  0  1  0  0
#  7  0 0  0  0  1  0  0
#  8  0 0  0  0  0  0  0
#  9  0 0  0  1  0  1  0
#  10 0 0  0  0  1  0  0
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档