Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 拆分/展开DF列,其中每个观测值的值不同_R - Fatal编程技术网

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部分的速度。除此之外,我想我现在没有任何想法。