如何在R中使用从长到宽的分类变量重塑DF?

如何在R中使用从长到宽的分类变量重塑DF?,r,dataframe,reshape,tidyr,reshape2,R,Dataframe,Reshape,Tidyr,Reshape2,我不熟悉重塑数据帧。我有一个df,我想扩大它,这样我就可以在分析中使用它,比如集群和NMD。我发现了几个与如何重塑主要包含定量数据的数据(使用聚合函数)相关的问题和(答案),但在我的例子中,我的变量都是分类的 由于我的df有一千行和几十列,所以我创建了一个玩具df作为示例。看起来是这样的: df <- data.frame( id=c("a","c", "a","b","d","

我不熟悉重塑数据帧。我有一个df,我想扩大它,这样我就可以在分析中使用它,比如集群和NMD。我发现了几个与如何重塑主要包含定量数据的数据(使用聚合函数)相关的问题和(答案),但在我的例子中,我的变量都是分类的

由于我的df有一千行和几十列,所以我创建了一个玩具df作为示例。看起来是这样的:

df <- data.frame(
  id=c("a","c", "a","b","d","c","e","d","c","a","a","e","a","b","d"), 
  color=c("red", "blue", "gray", "yellow", "green","green","blue","purple"            ,"black","green","yellow","blue","red","yellow","gray"),
  fruit=c("apple", "orange", "avocado", "strawberry", "banana", "apple",               "orange", "avocado", "strawberry", "banana","banana", "strawberry",           "watermelon", "lemon", "lemon" ),
  country = c("Italy", "Spain", "Brazil", "Brazil", "Australia", "Italy",           "Japan", "India", "USA", "Mexico", "USA", "Mexico", "Spain",              "France", "France"),
  animal=c("alligator", "camel", "alligator", "bat", "dolphin", "camel",                "elephant", "dolphin", "camel", "alligator", "alligator",                    "elephant", "alligator", "bat", "dolphin")) 
我还尝试更广泛地使用tidyr::pivot_实现这一点,但没有成功

有没有一种方法可以通过使用reforme2::dcast或tidyr::pivot\u wider或R中的任何其他函数来实现我的目标?
如果你们能帮助我,我将不胜感激。提前感谢。

首先,您必须将所需的列名插入到一个列中。然后,我按照未来的列名对其进行了排列,以便对单词进行分组,就像您的图像一样,然后我使用了
pivot\u wide
。它放下了动物栏,所以我把它放回去,然后按id排列,这样它们的观察顺序就会和你的图像一样

pivot_longer(df, cols = color:country, names_to = "variable", 
             values_to = "value") %>%                       # column names to rows
  arrange(variable, value) %>%                              # organize future column names
  pivot_wider(!variable, names_from = value, values_from = animal, 
              values_fn = list(animal = length), values_fill = 0) %>%
  left_join(distinct(df[,c(1,5)])) %>%                      # add animals back
  select(id, animal, everything()) %>%                      # rearrange columns
  arrange(id)                                               # reorder observations

根据您的评论更新——按颜色、水果、国家顺序排列

添加了
mutate
并修改了第一个
arrange
pivot\u-wide

pivot_longer(df,cols = color:country, names_to = "variable", 
             values_to = "value") %>%                # future col names to rows
  mutate(ordering = ifelse(variable == "color", 1,   # create organizer variable
                           ifelse(variable == "fruit", 2, 3))) %>% 
  arrange(ordering, value) %>%                       # organize future column order
  pivot_wider(!c(variable,ordering),                 # make it wide
              names_from = value, 
              values_from = animal, 
              values_fn = list(animal = length), 
              values_fill = 0) %>%
  left_join(distinct(df[,c(1,5)])) %>%               # add the animals back
  select(id, animal, everything()) %>%               # move animals to 2nd position
  arrange(id)                                        # reorder observations 
请查看:

欢迎来到SO,没有回答您的问题吗?谢谢@Jan,我会查看的!非常感谢你的帮助!我编辑这个问题是因为我注意到了一个问题。我希望变量“颜色”、“水果”和“国家”的级别按此顺序显示。我上传的图片中变量的级别按如下顺序排列:“颜色”、“国家”和“水果”。因为我希望实际数据帧中的变量按特定顺序排列,如果我按原样使用代码,它将返回一个df,其中列按字母顺序排列。你能更新你的答案来解决这个问题吗?抱歉我的愚蠢。按要求更新!太神了它工作得很好。非常感谢你,凯特!
pivot_longer(df, cols = color:country, names_to = "variable", 
             values_to = "value") %>%                       # column names to rows
  arrange(variable, value) %>%                              # organize future column names
  pivot_wider(!variable, names_from = value, values_from = animal, 
              values_fn = list(animal = length), values_fill = 0) %>%
  left_join(distinct(df[,c(1,5)])) %>%                      # add animals back
  select(id, animal, everything()) %>%                      # rearrange columns
  arrange(id)                                               # reorder observations
pivot_longer(df,cols = color:country, names_to = "variable", 
             values_to = "value") %>%                # future col names to rows
  mutate(ordering = ifelse(variable == "color", 1,   # create organizer variable
                           ifelse(variable == "fruit", 2, 3))) %>% 
  arrange(ordering, value) %>%                       # organize future column order
  pivot_wider(!c(variable,ordering),                 # make it wide
              names_from = value, 
              values_from = animal, 
              values_fn = list(animal = length), 
              values_fill = 0) %>%
  left_join(distinct(df[,c(1,5)])) %>%               # add the animals back
  select(id, animal, everything()) %>%               # move animals to 2nd position
  arrange(id)                                        # reorder observations