问题描述
我有一个名为KID的数据集,其中的STRATA列具有4位数字(nnnn)。每个数字代表医院的不同特征(地理,大小,类型等),具体取决于号码的位置及其值。例如:
KID $ STRATA
第一位数=地理位置:东北(1),中西部(2),南(3),西(4)
第二位数字=控制权:政府(1),私人,非营利组织(2),私人,投资者所有(3),私人(非盈利或投资者所有)(4)>
第三位=位置/教学:农村(1),城市非教学(2),城市教学(3)
第四位=床型:小(1),中(2),大(3)
是否有一种方法可以将每个数字(第一个数字分成一个新的列,第二个数字分成一个不同的列,对于第三和第四个类似)分成不同的列并根据其特征重命名?
解决方法
使用strsplit
,您可以在每个字符上分割字符串并创建新列。
cols <- c('geography','Control','Location','Bedsize')
KID[cols] <- do.call(rbind,strsplit(as.character(KID$STRATA),''))
KID
# STRATA geography Control Location Bedsize
#1 4231 4 2 3 1
#2 2321 2 3 2 1
#3 3133 3 1 3 3
#4 2112 2 1 1 2
#5 3212 3 2 1 2
或使用splitstackshape
:
splitstackshape::cSplit(KID,'STRATA','',stripWhite = FALSE,drop = FALSE)
数据
KID <- data.frame(STRATA = c(4231,2321,3133,2112,3212))
,
您不需要正则表达式。使用“ tidyr”和“ dplyr”。可以为“ tidyr”中的“ separate()”函数提供一个字符位置的向量以进行分割。
library(dplyr)
library(tidyr)
KID %>% separate(col = STRATA,sep = 1:4,into = c("Region","Control","Location_Teaching","Bedsize"))
Region Control Location_Teaching Bedsize
1 4 2 3 1
2 2 3 2 1
3 3 1 3 3
4 2 1 1 2
5 3 2 1 2
,
data.table
解决方案
library( data.table )
KID <- data.table( STRATA = c(4231,3212) )
cols = c("Geographic_location","Bedsize" )
KID[,(cols) := tstrsplit( STRATA,"" ) ]
# STRATA Geographic_location Control Location_Teaching Bedsize
# 1: 4231 4 2 3 1
# 2: 2321 2 3 2 1
# 3: 3133 3 1 3 3
# 4: 2112 2 1 1 2
# 5: 3212 3 2 1 2