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
R:列中定义了多个变量?_R_Tidyverse - Fatal编程技术网

R:列中定义了多个变量?

R:列中定义了多个变量?,r,tidyverse,R,Tidyverse,你好,晚上好 我确实有一个数据集的问题,我似乎无法解决,即使我在R尝试了几个小时 下面是最简单的工作示例 library(tidyverse) mytibble <- tribble( ~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3, "A" , "postcode" , "A110" , "B220", "Z

你好,晚上好

我确实有一个数据集的问题,我似乎无法解决,即使我在R尝试了几个小时

下面是最简单的工作示例

library(tidyverse)

mytibble <- tribble(
  ~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3,
  "A"    , "postcode"  , "A110"    , "B220", "Z112",
  "A"    , "itemssold" , "10"      , "20"    ,"30",
  "B"    , "postcode"  , "A214"    , "C112", NA,
  "B"    , "itemssold" , "15"      , "20"    , NA,
  "C"    , "postcode"  , "A221"    , NA    , NA,
  "C"    , "itemssold" , "4"       , NA    , NA)
可以看到,在变量oldvarname中定义了两个变量postcode和itemssold。然后可以从变量postcode1到postcodex推断变量值

以下是我期望的最终结果:

goal <- tribble(
  ~shopid, ~postcode, ~itemssold,
  "A"    , "A110"   , 10,
  "A"    , "B220"   , 20, 
  "A"    , "Z112"   , 30,
  "B"    , "A214"   , 15,
  "B"    , "C112"   , 20,
  "C"    , "A221"   , 4)
我试图通过使用pivot_加宽和pivot_加长或tidyverse的组合来达到我的目标,但似乎无法解决我的问题

如有任何有益的意见,我将不胜感激

事先非常感谢

小型动物

library(tidyverse)

mytibble <- tribble(
  ~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3,
  "A"    , "postcode"  , "A110"    , "B220", "Z112",
  "A"    , "itemssold" , "10"      , "20"    ,"30",
  "B"    , "postcode"  , "A214"    , "C112", NA,
  "B"    , "itemssold" , "15"      , "20"    , NA,
  "C"    , "postcode"  , "A221"    , NA    , NA,
  "C"    , "itemssold" , "4"       , NA    , NA)

df1 <- mytibble %>% 
  filter(oldvarname=="postcode") %>% 
  pivot_longer(
    cols = starts_with("postcode"),
    names_to = "names",
    values_to = "postcode"
  ) %>% 
  select(-oldvarname, -names) %>% 
  drop_na()

df2 <- mytibble %>% 
  filter(oldvarname=="itemssold") %>% 
  pivot_longer(
    cols = starts_with("postcode"),
    names_to = "names",
    values_to = "itemssold"
  ) %>%  
  select(-oldvarname, -names) %>% 
  drop_na()

df1$itemssold <- df2$itemssold
你可以试试

mytibble %>% 
  pivot_longer(-1:-2, names_prefix ="postcode") %>% 
  pivot_wider(names_from = oldvarname, values_from = value) %>% 
  filter(complete.cases(.))
# A tibble: 6 x 4
  shopid name  postcode itemssold
  <chr>  <chr> <chr>    <chr>    
1 A      1     A110     10       
2 A      2     B220     20       
3 A      3     Z112     30       
4 B      1     A214     15       
5 B      2     C112     20       
6 C      1     A221     4  
你可以试试

mytibble %>% 
  pivot_longer(-1:-2, names_prefix ="postcode") %>% 
  pivot_wider(names_from = oldvarname, values_from = value) %>% 
  filter(complete.cases(.))
# A tibble: 6 x 4
  shopid name  postcode itemssold
  <chr>  <chr> <chr>    <chr>    
1 A      1     A110     10       
2 A      2     B220     20       
3 A      3     Z112     30       
4 B      1     A214     15       
5 B      2     C112     20       
6 C      1     A221     4  

不确定是否卡在tidyverse上,但有一些关于data.table的相当详细的渐晕图,说明如何从长格式切换到宽格式,请参阅:不确定是否卡在tidyverse上,但有一些关于data.table的相当详细的渐晕图,说明如何从长格式切换到宽格式,请参阅:应删除TIBLE中的“名称”列。在您的代码中有了这一行,我的代码就不会那么尴尬了-非常感谢您为我的问题提供了聪明的解决方案。我学到了很多。再次感谢:-应删除tibble中的“名称”列。在您的代码中有了这一行,我的代码就不会那么尴尬了-非常感谢您为我的问题提供了聪明的解决方案。我学到了很多。再次感谢:-非常感谢您的方法。我有一个类似的想法,但不知怎么的,在路上迷路了!非常感谢,非常感谢你的方法。我有一个类似的想法,但不知怎么的,在路上迷路了!非常感谢你。