将逗号分隔值拆分到r中的列

vq8itlhq  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(142)

下面是我数据示例:

> a
   sample(dt$r, 10)
1                                  5
2                              2,5,6
3                                  5
4                               <NA>
5                               <NA>
6                                  5
7                                2,6
8                                  5
9                               <NA>
10                              <NA>

我想将这些值分隔开,并将它们转换为列。 Dataframe 应如下所示:

2      5    6
    1                              FALSE    TRUE  FALSE
    2                              TRUE     TRUE  FALSE
    3                              FALSE    FALSE FALSE 
    4                              FALSE    FALSE FALSE 
    5                              FALSE    FALSE FALSE 
    6                              FALSE    TRUE  FALSE 
    7                              TRUE     FALSE TRUE
    8                              FALSE    TRUE  FALSE 
    9                              FALSE    FALSE FALSE 
    10                             FALSE    FALSE FALSE

我尝试使用tidyr::spread或strsplit,但似乎找不到方法

d8tt03nd

d8tt03nd1#

如果你非要概括的话,这不是最好的答案。

数据

data <- data.frame(aux = c("5","2,5,6","5",NA,NA,"2,6"))

代码

library(dplyr)
library(stringr)

data %>%
  mutate(
    `2` = if_else(str_detect(aux,"2"),TRUE,FALSE),
    `5` = if_else(str_detect(aux,"5"),TRUE,FALSE),
    `6` = if_else(str_detect(aux,"6"),TRUE,FALSE)
  ) %>% 
  replace_na(list(`2` = FALSE,`5` = FALSE,`6` = FALSE))

输出

aux     2     5     6
1     5 FALSE  TRUE FALSE
2 2,5,6  TRUE  TRUE  TRUE
3     5 FALSE  TRUE FALSE
4  <NA> FALSE FALSE FALSE
5  <NA> FALSE FALSE FALSE
6   2,6  TRUE FALSE  TRUE
f3temu5u

f3temu5u2#

使用strsplit是一种方法。
首先获取strsplit列表形式的 Dataframe ,然后获取不含<NA>的值,最后查找与sapply的匹配项。

df_split <- strsplit(df$r, ",")

df_split_val <- sort(unique(unlist(df_split)))[2:4]

setNames(data.frame(t(sapply(df_split, function(x) 
  df_split_val %in% x))), df_split_val)
       2     5     6
1  FALSE  TRUE FALSE
2   TRUE  TRUE  TRUE
3  FALSE  TRUE FALSE
4  FALSE FALSE FALSE
5  FALSE FALSE FALSE
6  FALSE  TRUE FALSE
7   TRUE FALSE  TRUE
8  FALSE  TRUE FALSE
9  FALSE FALSE FALSE
10 FALSE FALSE FALSE
数据
df <- structure(list(r = c("5", "2,5,6", "5", "<NA>", "<NA>", "5",
"2,6", "5", "<NA>", "<NA>")), class = "data.frame", row.names = c(NA,
-10L))
kx5bkwkv

kx5bkwkv3#

更一般的解决方案:
1.确定列中存在的所有唯一项

dt <- data.frame(r = c("5","2,5,6","5",NA,NA,"2,6"))
items <- sort(unique(unlist(strsplit(unique(dt$r), ","))))
items
[1] "2" "5" "6"

1.通过使用grepl查找字符串内匹配项,为每个唯一项创建列

dt2 <- as.data.frame(sapply(items, function(item) grepl(item, dt$r, fixed=TRUE)))
dt2
      2     5     6
1 FALSE  TRUE FALSE
2  TRUE  TRUE  TRUE
3 FALSE  TRUE FALSE
4 FALSE FALSE FALSE
5 FALSE FALSE FALSE
6  TRUE FALSE  TRUE

相关问题