jrs*_*s-x 24 split r dataframe
我有一个带有数字ID变量的数据框,用于从多级采样方案中识别主要,次要和终极采样单元.我想将原始ID变量拆分为三个新变量,分别识别不同的采样单元:
例:
>df[1:2,]
ID Var var1 var2 var3 var4 var5
501901 9 SP.1 1 W 12.10
501901 9 SP.1 2 W 17.68
Run Code Online (Sandbox Code Playgroud)
我想要的是:
>df[1:2,]
ID1 ID2 ID3 var1 var2 var3 var4 var5
5 01 901 9 SP.1 1 W 12.10
5 01 901 9 SP.1 2 W 17.68
Run Code Online (Sandbox Code Playgroud)
我知道R中有一些功能可以分割字符串,但我找不到相同的数字设施.
谢谢,
胡安
EDi*_*EDi 21
您可以使用例如使用substring:
df <- data.frame(ID = c(501901, 501902))
splitted <- t(sapply(df$ID, function(x) substring(x, first=c(1,2,4), last=c(1,3,6))))
cbind(df, splitted)
# ID 1 2 3
#1 501901 5 01 901
#2 501902 5 01 902
Run Code Online (Sandbox Code Playgroud)
A5C*_*2T1 13
然而,另一个替代方案是使用重新读取的第一列read.fwf和指定的宽度:
cbind(read.fwf(file = textConnection(as.character(df[, 1])),
widths = c(1, 2, 3), colClasses = "character",
col.names = c("ID1", "ID2", "ID3")),
df[-1])
# ID1 ID2 ID3 var1 var2 var3 var4 var5
# 1 5 01 901 9 SP.1 1 W 12.10
# 2 5 01 901 9 SP.1 2 W 17.68
Run Code Online (Sandbox Code Playgroud)
这里的一个优点是能够以方便的方式设置结果列名称,并确保列是字符,从而保留可能存在的任何前导零.
这应该工作:
df <- cbind(do.call(rbind, strsplit(gsub('(.)(..)(...)', '\\1 \\2 \\3', paste(df[,1])),' ')), df[,-1]) # You need that paste() there because gsub() works only with text.
Run Code Online (Sandbox Code Playgroud)
或者 substr()
df <- cbind(ID1=substr(df[, 1],1,1), ID2=substr(df[, 1],2,3), ID3=substr(df[, 1],4,6), df[, -1])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29608 次 |
| 最近记录: |