R 拆分列,将结果列转换为因子
我的目标是将由1和0组成的字符列拆分为各自的列。我希望新列的类型为“factor”。我已经找到了一种很好的分割列的方法(使用dplyr的“mutate”和restrape2的“colsplit”),但是没有找到一种有效的方法使所有生成的列都是“factor”类型 以下是我的问题的一个最小示例: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
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