使用tidyverse将字符串列拆分为许多列

时间:2019-01-12 17:53:00

标签: r tidyverse tidyr comma stringr

我有一个带逗号的字符串列。我想将此单列转换为多个带标签的列,并适当地填充值。输出数据帧将具有3列(A,B和C)。第1行的A和B列分别用“是”填充,C列用“否”填充。第2行的所有3列均填充“是”,等等。

df1 <- data.frame(X= c("A, B", "A, B, C", "A", "A, C"))

df1
        X
1    A, B
2 A, B, C
3       A
4    A, C

必需的输出

A    B    C
Yes  Yes  No
Yes  Yes  Yes
Yes  No   No
Yes  No   Yes

请提供任何提示。

6 个答案:

答案 0 :(得分:4)

类似这样的东西:

library(tidyverse)

df1 %>%
  mutate(id = row_number()) %>% 
  separate_rows(X) %>% 
  group_by(id) %>% 
  mutate(Y = "yes") %>% 
  spread(X, Y, fill = "no")

# A tibble: 4 x 4
# Groups:   id [4]
     id A     B     C    
  <int> <chr> <chr> <chr>
1     1 yes   yes   no   
2     2 yes   yes   yes  
3     3 yes   no    no   
4     4 yes   no    yes  

答案 1 :(得分:3)

这是将400ibase R一起使用的选项。我们将table的'X'列拆分为,list的一个vector,用data.frame将其转换为两列stack,用table并将其转换为逻辑

table(stack(setNames(strsplit(as.character(df1$X), ", +"), 
                    seq_len(nrow(df1))))[2:1]) > 0
 #   values
#ind    A     B     C
#  1 TRUE  TRUE FALSE
#  2 TRUE  TRUE  TRUE
#  3 TRUE FALSE FALSE
#  4 TRUE FALSE  TRUE

答案 2 :(得分:3)

通过stringi

stringi::stri_split_fixed(df1$X, ", ", simplify = TRUE) != ""
#      [,1]  [,2]  [,3]
# [1,] TRUE  TRUE FALSE
# [2,] TRUE  TRUE  TRUE
# [3,] TRUE FALSE FALSE
# [4,] TRUE  TRUE FALSE

TRUE / FALSE本质上是yes / no,但是如果您需要字符矩阵,则可以始终执行ifelse(., "yes", "no")并保留矩阵结构。 / p>

答案 3 :(得分:2)

一种不依赖分组的略有不同的方法。最终转换为“是/否”也是按列进行的,而不是依赖于从长数据到宽数据的转换。对于非常大的数据集,这可能会更有效。

df2 <- df1 %>% 
  mutate(row_num = 1:n()) %>% 
  separate_rows(X) %>% 
  spread(X, 1) %>% 
  select(-row_num) %>% 
  mutate_all(~ifelse(!is.na(.), 'Yes', 'No'))

    A   B   C
1 Yes Yes  No
2 Yes Yes Yes
3 Yes  No  No
4 Yes  No Yes

答案 4 :(得分:1)

使用splitstackshape

library(splitstackshape)
newdf=cSplit_e(df1, "X", sep = ", ",type = "character")
newdf[newdf==1]='Yes'
newdf[is.na(newdf)]='No'

newdf
        X X_A X_B X_C
1    A, B Yes Yes  No
2 A, B, C Yes Yes Yes
3       A Yes  No  No
4    A, C Yes  No Yes

答案 5 :(得分:1)

这是from jnius import cast from jnius import autoclass from kivy.context import get_current_context app_to_launch = "org.package.name" PythonActivity = autoclass('org.kivy.android.PythonActivity') activity = cast('android.app.Activity', PythonActivity.mActivity) pm = activity.getPackageManager() app_intent = pm.getLaunchIntentForPackage(app_to_launch) activity.startActivity(app_intent)

中的另一种解决方案
base