我实际上有一个2000行(不同日期)的数据框,每行包含一个字符“vector”,其中包含30种不同技能的二进制信息。如果已使用该技能,则其数字将出现在向量中。但要简化:
如果我有一个包含10个不同技能的3个观察(3天)的数据框 - 名为"S_total"
:
S_total= [1,3,7,8,9,10], [5,9], []
和变量Day= 1,2,3
我想构建一个包含3行和12列的数据帧
列为:Day,S_total,,s1,s,2,s3,s4,s5,s6,s7,s8,s9,s10
其中编号变量的格式为true/false
。
我想到了as.numeric(read.csv)
的方向,然后是for
- 包含cbind
的循环。
但必须有更好的方法吗?整洁的诗?我希望有人展示:正则表达式和Map-command
答案 0 :(得分:0)
您只需使用dataFrame$newColumn
或dataFrame[, "newColum]
添加新列即可。然后,您可以使用grepl
来测试是否在向量dataFrame$S_total
中找到了某项技能。例如
dataFrame[, "1"] <- grepl("1", dataFrame$S_total)
要获得数据集中出现的所有不同技能,您可以将字符向量拆分为单个数字,然后使用唯一。然后,您可以循环使用所有不同的技能,并为每项技能创建一个新列:
> dataFrame <- data.frame(S_total = c(toString(c(1,3,7,8,11,20)), toString(c(5,12)), ""),
+ Day = c(1,2,3),
+ stringsAsFactors = FALSE)
>
> dataFrame
S_total Day
1 1, 3, 7, 8, 11, 20 1
2 5, 12 2
3 3
>
> allSkill <- sort(unique(unlist(strsplit(dataFrame$S_total, ", "))))
> for(i in allSkill){
+ dataFrame[, i] <- grepl(i, dataFrame$S_total)
+ }
> dataFrame
S_total Day 1 11 12 20 3 5 7 8
1 1, 3, 7, 8, 11, 20 1 TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
2 5, 12 2 TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
3 3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
如果您的数据集不是那么大,那么就可以了。如果你有一个非常大的集合并且性能很重要,你可以先创建空列然后遍历它们,这样可以提高性能see。
在我看来,无需使用地图或任何tidyverse包。
答案 1 :(得分:0)
非常酷的解决方案,正是我需要的。我只需要移除括号即可使其工作。所以,想象我的矢量&#34; S_total&#34;有括号,我必须:
S_total_nobracket <- gsub("\\[|\\]", "", S_total).
感谢工厂,感谢您的回答。这正是我所需要的: - )