我的数据集如下所示:
key date census
1: 01_35004_10-14_+_M 11NOV2001 2.934397
2: 01_35004_10-14_+_M 06JAN2002 3.028231
3: 01_35004_10-14_+_M 07APR2002 3.180712
4: 01_35004_10-14_+_M 02JUN2002 3.274546
5: 01_35004_10-14_+_M 28JUL2002 3.368380
6: 01_35004_10-14_+_M 22SEP2002 3.462214
7: 01_35004_10-14_+_M 22DEC2002 3.614694
8: 01_35004_10-14_+_M 16FEB2003 3.708528
9: 01_35004_10-14_+_M 13JUL2003 3.954843
10:01_35004_10-14_+_M 07SEP2003 4.048677
“键”列中的某些字符对应于不同的变量。例如:01是州,35004是邮政编码,10-14是年龄组,+是种族,M是性别
我想提取这些字符中的每个字符以为其创建单独的变量(即,用于填充状态为01的列,用于邮政编码为35004的列等)
这是我的代码:
Var = c("State","Zip_Code", "Age_Group", "Race", "Gender")
for(j in Var){
play$j = gsub("_.*$","",play$key)
}
显然,这是不正确的。我希望循环遍历“键”(key)列中的每个观察值,并产生一个变量,并与该变量关联提取的字符。
请帮忙
尝试
library(tidyr)
df_sep <- separate(df, key, into=c("State","Zip_Code", "Age_Group", "Race", "Gender"), sep="_")
State Zip_Code Age_Group Race Gender date census
1 01 35004 10-14 + M 11NOV2001 2.934397
2 01 35004 10-14 + M 06JAN2002 3.028231
3 01 35004 10-14 + M 07APR2002 3.180712
4 01 35004 10-14 + M 02JUN2002 3.274546
5 01 35004 10-14 + M 28JUL2002 3.368380
6 01 35004 10-14 + M 22SEP2002 3.462214
7 01 35004 10-14 + M 22DEC2002 3.614694
8 01 35004 10-14 + M 16FEB2003 3.708528
9 01 35004 10-14 + M 13JUL2003 3.954843
10 01 35004 10-14 + M 07SEP2003 4.048677
编辑:好的,在您的评论中您已经清楚地表明,您确实希望有一个通过观察循环的解决方案,这是一种低效的方法,并且由于充分的原因通常被认为是不好的做法。表示反对后,让我向您介绍一种方法:
首先,我们需要用列填充数据框。要使用您的方法,应为:
Var = c("State","Zip_Code", "Age_Group", "Race", "Gender")
for(j in Var){
df <- within(df, assign(j, NA))
}
但是,一种更有效的方法是:
df[, Var]<- NA
两者都给:
head(df)
key date census State Zip_Code Age_Group Race Gender
1 01_35004_10-14_+_M 11NOV2001 2.934397 NA NA NA NA NA
2 01_35004_10-14_+_M 06JAN2002 3.028231 NA NA NA NA NA
3 01_35004_10-14_+_M 07APR2002 3.180712 NA NA NA NA NA
4 01_35004_10-14_+_M 02JUN2002 3.274546 NA NA NA NA NA
5 01_35004_10-14_+_M 28JUL2002 3.368380 NA NA NA NA NA
6 01_35004_10-14_+_M 22SEP2002 3.462214 NA NA NA NA NA
现在,对于每个观察,我们都希望将其拆分key
为各个组成部分,并在第4至8列中填充相应的元素。这将通过以下方式实现:
df[, Var] <- t(sapply(df$key, function(x) unlist(strsplit(as.character(x[1]), "_"))))
在这里,sapply
遍历的元素df$key
并将每个元素作为我定义的函数的参数传递,并将结果收集在数组中。
看:
sapply(df$key, function(x) unlist(strsplit(as.character(x[1]), "_")))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "01" "01" "01" "01" "01" "01" "01" "01" "01" "01"
[2,] "35004" "35004" "35004" "35004" "35004" "35004" "35004" "35004" "35004" "35004"
[3,] "10-14" "10-14" "10-14" "10-14" "10-14" "10-14" "10-14" "10-14" "10-14" "10-14"
[4,] "+" "+" "+" "+" "+" "+" "+" "+" "+" "+"
[5,] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M"
对其t()
进行转置可确保它“适合”数据框df[, Var]
,在这里您将看到结果相同:
identical(df[,Var], df_sep[Var])
[1] TRUE
我假设某些条目df$key
的格式不同,这就是为什么您可能要首先检查每个值的原因。为此,您可以在sapply
调用中修饰该函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句