R:将字符向量 (json) 中的整数转换为多个布尔列
R: convert integers in a character vector (json) to multiple boolean columns
我实际上有一个包含 2000 行(不同日期)的数据框,每行包含一个字符“向量”,其中包含 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
您可以使用 dataFrame$newColumn
或 dataFrame[, "newColum]
简单地添加一个新列。然后你可以使用 grepl
来测试是否在向量 dataFrame$S_total
中找到了技能。例如
dataFrame[, "1"] <- grepl("1", dataFrame$S_total)
要获得数据集中出现的所有不同技能,您可以将字符向量拆分为单个数字,然后使用 unique。然后你可以遍历所有不同的技能并为每个技能创建一个新列:
> 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 包。
非常酷的解决方案,正是我所需要的。我只需要移除我的括号就可以让它工作。所以,假设我的向量 "S_total" 有括号,我必须:
S_total_nobracket <- gsub("\[|\]", "", S_total).
感谢一磨,您的回答。这正是我所需要的:-)
我实际上有一个包含 2000 行(不同日期)的数据框,每行包含一个字符“向量”,其中包含 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
您可以使用 dataFrame$newColumn
或 dataFrame[, "newColum]
简单地添加一个新列。然后你可以使用 grepl
来测试是否在向量 dataFrame$S_total
中找到了技能。例如
dataFrame[, "1"] <- grepl("1", dataFrame$S_total)
要获得数据集中出现的所有不同技能,您可以将字符向量拆分为单个数字,然后使用 unique。然后你可以遍历所有不同的技能并为每个技能创建一个新列:
> 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 包。
非常酷的解决方案,正是我所需要的。我只需要移除我的括号就可以让它工作。所以,假设我的向量 "S_total" 有括号,我必须:
S_total_nobracket <- gsub("\[|\]", "", S_total).
感谢一磨,您的回答。这正是我所需要的:-)