R 拆分/展开DF列,其中每个观测值的值不同
假设我有一个如下所示的数据帧:R 拆分/展开DF列,其中每个观测值的值不同,r,R,假设我有一个如下所示的数据帧: mydf <- structure(list(club_member = c(0L, 0L, 1L, 0L, 0L, 0L), map_of_blah = c(NA, "{Upgrade=1.0}", "{Apples=0.32786885245901637, In-Game Boost=0.06
mydf <- structure(list(club_member = c(0L, 0L, 1L, 0L, 0L, 0L), map_of_blah = c(NA,
"{Upgrade=1.0}", "{Apples=0.32786885245901637, In-Game Boost=0.06557377049180328, WalkoffGm=0.08196721311475409, Improve=0.5245901639344263}",
NA,
"{MystBox=0.9977827050997783, Upgrade=0.0022172949002217295, Apples = 1}",
NA)), row.names = c(NA, 6L), class = "data.frame")
glimpse(mydf)
Observations: 6
Variables: 2
$ club_member <int> 0, 0, 1, 0, 0, 0
$ map_of_blah <chr> NA, "{Upgrade=1.0}", "{Apples=0.32786885245901637, In-Game Boost=0.06557377049180328, WalkoffGm=0.08196721311475409, Improve=0.5245901639344263}", NA, "{MystBox=0.9977827050997783, …
mydf
club_member map_of_blah
1 0 <NA>
2 0 {Upgrade=1.0}
3 1 {Apples=0.32786885245901637, In-Game Boost=0.06557377049180328, WalkoffGm=0.08196721311475409, Improve=0.5245901639344263}
4 0 <NA>
5 0 {MystBox=0.9977827050997783, Upgrade=0.0022172949002217295, Apples = 1}
6 0 <NA>
我直接将数据从数据库拉入r,其中一种数据类型Presto db是一个数组映射,其中r。在r中,它看起来像是作为每个观察的字符向量读入的
“map_of_blah”字段的每个向量包含不同的值,但数据集中可能总共有15到20个值,如“Apple”、“游戏内增强”、“改进”等
我想把这个字段处理成一个新的字段集,每个字段对应于“map_of_blah”下向量中包含的不同值
在深入研究loops和regex之前,我想知道ayone以前是否遇到过这个问题,是否有一种“正确”的方法来解决这个问题?我一直在寻找tidyr的扩散函数,但我不确定这是否适用于这里,因为每个观测向量中的场数不同
我如何处理mydf,以便在map_of_blah中为名称-值对及其相应的值添加额外的字段?试试这个
library(tidyverse)
mydf %>%
rownames_to_column("ID") %>%
mutate(map_of_blah = str_remove_all(map_of_blah, "\\{|\\}") %>%
str_split(., ",\\s")) %>%
unnest() %>%
separate(col = map_of_blah, into = c("newcol", "newval"), sep = "=") %>%
mutate(newcol = str_trim(newcol, "both"),
newval = as.numeric(newval)) %>%
spread(newcol, newval)
我们首先为用户创建一个ID,然后分离blah映射中的所有项目,然后取消长格式。之后,我们分离列,以便得到两个新列,一个是标题,另一个是值。最后,我们传播到世界各地
如果有什么不清楚的地方,请告诉我。试试这个
library(tidyverse)
mydf %>%
rownames_to_column("ID") %>%
mutate(map_of_blah = str_remove_all(map_of_blah, "\\{|\\}") %>%
str_split(., ",\\s")) %>%
unnest() %>%
separate(col = map_of_blah, into = c("newcol", "newval"), sep = "=") %>%
mutate(newcol = str_trim(newcol, "both"),
newval = as.numeric(newval)) %>%
spread(newcol, newval)
我们首先为用户创建一个ID,然后分离blah映射中的所有项目,然后取消长格式。之后,我们分离列,以便得到两个新列,一个是标题,另一个是值。最后,我们传播到世界各地
如果有什么不清楚的地方,请告诉我。这里有一种使用dplyr和tidyr的方法-
这里有一种使用dplyr和tidyr的方法-
这里有一个str_提取和扩散选项。使用str_extract_all,从“map_of_blah”中获取相关子字符串作为列表列,取消对数据集的测试,将类型从readr更改为convert,并扩展为“wide”格式
library(tidyverse)
mydf %>%
transmute(ID = row_number(), club_member,
key = str_extract_all(map_of_blah, "\\w+(?=\\=)"),
val = str_extract_all(map_of_blah, "(?<=\\=)[0-9.]+")) %>%
unnest(c(key, val)) %>%
type_convert %>%
spread(key, val) %>%
select(-"<NA>")
# A tibble: 6 x 8
# ID club_member Apples Boost Improve MystBox Upgrade WalkoffGm
# <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 0 NA NA NA NA NA NA
#2 2 0 NA NA NA NA 1 NA
#3 3 1 0.328 0.0656 0.525 NA NA 0.0820
#4 4 0 NA NA NA NA NA NA
#5 5 0 NA NA NA 0.998 0.00222 NA
#6 6 0 NA NA NA NA NA NA
这里有一个str_提取和扩散选项。使用str_extract_all,从“map_of_blah”中获取相关子字符串作为列表列,取消对数据集的测试,将类型从readr更改为convert,并扩展为“wide”格式
library(tidyverse)
mydf %>%
transmute(ID = row_number(), club_member,
key = str_extract_all(map_of_blah, "\\w+(?=\\=)"),
val = str_extract_all(map_of_blah, "(?<=\\=)[0-9.]+")) %>%
unnest(c(key, val)) %>%
type_convert %>%
spread(key, val) %>%
select(-"<NA>")
# A tibble: 6 x 8
# ID club_member Apples Boost Improve MystBox Upgrade WalkoffGm
# <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 0 NA NA NA NA NA NA
#2 2 0 NA NA NA NA 1 NA
#3 3 1 0.328 0.0656 0.525 NA NA 0.0820
#4 4 0 NA NA NA NA NA NA
#5 5 0 NA NA NA 0.998 0.00222 NA
#6 6 0 NA NA NA NA NA NA
当同一个俱乐部成员有多个值时,您想做什么?例如,club_member 0同时具有Upgrade=1.0和Upgrade=0.0022172949002217295 club member不是id,而是一个布尔变量,表示用户是否为club member。每一行都是一个用户。我的名字不好,对不起,这可能是你想要的。别担心,这会有帮助。当同一个俱乐部成员有多个值时,你想做什么?例如,club_member 0同时具有Upgrade=1.0和Upgrade=0.0022172949002217295 club member不是id,而是一个布尔变量,表示用户是否为club member。每一行都是一个用户。我的名字不好,抱歉-这可能是你要找的。别担心,这只是后续的帮助。我的实际数据接近500万行,我的内存一直不足。在这方面,有什么想法可以让它更有效吗?我相信有办法加快regex部分的速度。除此之外,我认为我现在没有任何想法。只是作为后续行动。我的实际数据接近500万行,我的内存一直不足。在这方面,有什么想法可以让它更有效吗?我相信有办法加快regex部分的速度。除此之外,我想我现在没有任何想法。