R:列中定义了多个变量?
你好,晚上好 我确实有一个数据集的问题,我似乎无法解决,即使我在R尝试了几个小时 下面是最简单的工作示例R:列中定义了多个变量?,r,tidyverse,R,Tidyverse,你好,晚上好 我确实有一个数据集的问题,我似乎无法解决,即使我在R尝试了几个小时 下面是最简单的工作示例 library(tidyverse) mytibble <- tribble( ~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3, "A" , "postcode" , "A110" , "B220", "Z
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中的“名称”列。在您的代码中有了这一行,我的代码就不会那么尴尬了-非常感谢您为我的问题提供了聪明的解决方案。我学到了很多。再次感谢:-非常感谢您的方法。我有一个类似的想法,但不知怎么的,在路上迷路了!非常感谢,非常感谢你的方法。我有一个类似的想法,但不知怎么的,在路上迷路了!非常感谢你。