R 拆分列,将结果列转换为因子

R 拆分列,将结果列转换为因子,r,regex,dplyr,tidyverse,reshape2,R,Regex,Dplyr,Tidyverse,Reshape2,我的目标是将由1和0组成的字符列拆分为各自的列。我希望新列的类型为“factor”。我已经找到了一种很好的分割列的方法(使用dplyr的“mutate”和restrape2的“colsplit”),但是没有找到一种有效的方法使所有生成的列都是“factor”类型 以下是我的问题的一个最小示例: library(dplyr) library(reshape2) # Data frame to be processed df = tribble( ~x, ~y, ~z, "Alph

我的目标是将由1和0组成的字符列拆分为各自的列。我希望新列的类型为“factor”。我已经找到了一种很好的分割列的方法(使用dplyr的“mutate”和restrape2的“colsplit”),但是没有找到一种有效的方法使所有生成的列都是“factor”类型

以下是我的问题的一个最小示例:

library(dplyr)
library(reshape2)
# Data frame to be processed
df = tribble(
  ~x, ~y, ~z,
  "Alpha", "1111", "Alp",
  "Beta", "1001", "Bet"
)

# Vector Containing Names for columns
names = c("A", "B", "C", "D")

df %>%
  mutate_at("y", colsplit, names = names, pattern = "") 

输出:

# A tibble: 2 x 3
  x       y$A    $B    $C    $D z    
  <chr> <int> <int> <int> <int> <chr>
1 Alpha     1     1     1     1 Alp  
2 Beta      1     0     0     1 Bet 
结果如下:

# A tibble: 2 x 6
  x     A     B     C     D     z    
  <chr> <chr> <chr> <chr> <chr> <chr>
1 Alpha ""    1     1     1     Alp  
2 Beta  ""    1     0     0     Bet  
#一个tible:2 x 6
x A B C D z
1 Alpha“1 Alp
2 Beta“1 0 0下注
哪个似乎选择了字符串前的第一个空格?我不太确定这是怎么回事


另外,实际上,
y列中的字符串可以是不同的长度(但在正在处理的数据集中大小是一致的——例如,y可以是100个字符长,每行100个字符长)。

下面是一种使用
dplyr
tidyr

库(dplyr)
图书馆(tidyr)
#创建基于y索引长度从1到最大长度的动态名称向量
#As“”馈送要分离为分隔符,因此第一个匹配的是空字符
#在本例中,我们添加了一列,稍后将其删除到名称列表中。
姓名%
分开(“y”,放入=名称,sep=”,fill=“warn”)%>%
如果(.predicate=is.character,.funs=factor)%>%,则进行变异
选择(-drop)
#>#A tibble:2 x 6
#>x`1``2``3``4`z
#>        
#>1阿尔法1阿尔卑斯山
#>2贝塔1 0 1赌注
或仅将
名称中出现的列转换为因子的另一种方式

df%>%
分开(“y”,分为=名称,sep=”“)%>%
在(变量(名称之一)),.funs=因子)%>%
选择(-drop)
#>#A tibble:2 x 6
#>x`1``2``3``4`z
#>        
#>1阿尔法1阿尔卑斯山
#>2贝塔1 0 1赌注

由(v2.0.0)于2021-05-15创建,我不太确定您的要求,但您可以这样做(稍微更改df,以表明不需要对colname进行硬编码)

df=tribble(
~x,~y,~z,
“阿尔法”,“11113467909”,“阿尔卑斯山”,
“贝塔”,“1001”,“打赌”
)
#一个tibble:2x3
x y z
1阿尔法11113467909阿尔卑斯山
2贝塔1001赌注
df%>%
分离(y,分为=paste0('y',序列长度(1+max(nchar(.$y)))-1),sep='',fill='right')%>%
选择(!以(''0')结束)%>%
突变(跨越(以('y_u')开头,因子))
#一个tibble:2x15
x y_1 y_2 y_3 y_4 y_6 y_7 y_8 y_9 y_10 y_11 y_12 y_13 z
1阿尔法1 1 1 3 4 6 7 6 7 9 0 9阿尔卑斯山
2 Beta 1 0 0 1 NA NA NA NA NA打赌

您可以使用
splitstackshape::cSplit

library(dplyr)

splitstackshape::cSplit(df, 'y', sep = '', stripWhite = FALSE) %>%
  mutate(across(starts_with('y'), factor)) %>%
  rename_with(~names, starts_with('y'))

#       x   z A B C D
#1: Alpha Alp 1 1 1 1
#2:  Beta Bet 1 0 0 1
df = tribble(
  ~x, ~y, ~z,
  "Alpha", "1111346767909", "Alp",
  "Beta", "1001", "Bet"
)
# A tibble: 2 x 3
  x     y             z    
  <chr> <chr>         <chr>
1 Alpha 1111346767909 Alp  
2 Beta  1001          Bet

df %>%
  separate(y, into = paste0('y_', seq_len(1 + max(nchar(.$y)))-1), sep = '', fill = 'right' ) %>%
  select(!ends_with('_0')) %>%
  mutate(across(starts_with('y_'), factor))

# A tibble: 2 x 15
  x     y_1   y_2   y_3   y_4   y_5   y_6   y_7   y_8   y_9   y_10  y_11  y_12  y_13  z    
  <chr> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <chr>
1 Alpha 1     1     1     1     3     4     6     7     6     7     9     0     9     Alp  
2 Beta  1     0     0     1     NA    NA    NA    NA    NA    NA    NA    NA    NA    Bet 
library(dplyr)

splitstackshape::cSplit(df, 'y', sep = '', stripWhite = FALSE) %>%
  mutate(across(starts_with('y'), factor)) %>%
  rename_with(~names, starts_with('y'))

#       x   z A B C D
#1: Alpha Alp 1 1 1 1
#2:  Beta Bet 1 0 0 1