当前位置: 首页 > 知识库问答 >
问题:

如何交换R中的列和行条目

施敏达
2023-03-14
library(data.table)
dat1 <- data.table(id = c(1, 2, 34, 99),
           class = c("sports", "", "music, sports", ""),
           hobby = c("knitting, music, sports", "", "", "music"))
> dat1
  id         class                   hobby
1  1        sports knitting, music, sports
2  2                                      
3 34 music, sports                        
4 99                                 music

我有上面的数据集,< code>dat1,其中每一行对应一个唯一的< code>id。对于每个< code>id,< code>class或< code>hobby的多个输入由逗号分隔。

我想交换此数据集的行和列,以便获得以下内容:

     input class hobby
1   sports 1, 34     1
2 knitting           1
3    music    34 1, 99

在此数据集中,每一行都对应于来自< code>dat1的唯一< code >输入。现在< code>class和< code>hobby列存储来自< code>dat1的相应< code>id,每个id用逗号分隔。

在R中是否有像这样快速交换行和列的方法

共有3个答案

阎冠玉
2023-03-14

这是一个快速整理的方式

library(dplyr)
library(tidyr)
dat1 %>% 
  pivot_longer(-id, values_to = "input") %>%
  separate_rows(input) %>% 
  filter(input != "") %>% 
  pivot_wider(names_from = "name", values_from = "id", values_fn = toString)
  input    class hobby
1 sports   1, 34 1    
2 knitting NA    1    
3 music    34    1, 99
东云
2023-03-14

这里有一个(不是很长)< code>tidyverse选项。问题是未来“input”列的值分散在多个列中,并且可以在同一个字符串中包含几个值。

首先,pivot_longer将所有将来的输入都放到同一列中:

dat2 = dat1 %>% pivot_longer(!id)
dat2
# A tibble: 8 x 3
     id name  value                    
  <dbl> <chr> <chr>                    
1     1 class "sports"                 
2     1 hobby "knitting, music, sports"
3     2 class ""                       
4     2 hobby ""                       
5    34 class "music, sports"          
6    34 hobby ""                       
7    99 class ""                       
8    99 hobby "music" 

然后,方法是使用<code>stringr(<code>nchar(输入)

cbind(dat2, str_split(str_remove_all(dat2$value, ","), " ", simplify = T)) %>%
  select(!value) %>% 
  pivot_longer(!c("id", "name"), names_to = "name_2", values_to = "input") %>% 
  select(!name_2) %>% 
  filter(nchar(input)>0) %>%
  group_by(input, name) %>% 
  summarise(id = paste0(id, collapse = ",")) %>% 
  pivot_wider(names_from = name, values_from = id)

# A tibble: 3 x 3
# Groups:   input [3]
  input    hobby class
  <chr>    <chr> <chr>
1 knitting 1     NA   
2 music    1,99  34   
3 sports   1     1,34 
相野
2023-03-14

这是一个<code>数据。表解决方案

library(data.table)
dat1 <- data.table(id = c(1, 2, 34, 99),
                   class = c("sports", "", "music, sports", ""),
                   hobby = c("knitting, music, sports", "", "", "music"))
dat1
#>    id         class                   hobby
#> 1:  1        sports knitting, music, sports
#> 2:  2                                      
#> 3: 34 music, sports                        
#> 4: 99                                 music
# in long format
dt_melted <- melt.data.table(dat1, id.vars = "id", variable.name = "type", value.name = "value")
dt_melted
#>    id  type                   value
#> 1:  1 class                  sports
#> 2:  2 class                        
#> 3: 34 class           music, sports
#> 4: 99 class                        
#> 5:  1 hobby knitting, music, sports
#> 6:  2 hobby                        
#> 7: 34 hobby                        
#> 8: 99 hobby                   music

# split values by comma
dt_splitted <- dt_melted[, .(input = unlist(data.table::tstrsplit(value, ","))), by = .(id, type)]
dt_splitted
#>    id  type    input
#> 1:  1 class   sports
#> 2: 34 class    music
#> 3: 34 class   sports
#> 4:  1 hobby knitting
#> 5:  1 hobby    music
#> 6:  1 hobby   sports
#> 7: 99 hobby    music
# bring back to desired wide format
dt_casted <- dcast.data.table(dt_splitted, 
                              formula = "input ~ type",
                              value.var = "id",
                              fun.aggregate = paste, 
                              collapse = ", ")
dt_casted
#>       input class hobby
#> 1: knitting           1
#> 2:    music    34 1, 99
#> 3:   sports 1, 34     1
# combine ids by class/hobby
dt_splitted[, .(class = paste(id[type == "class"], collapse = ", "),
                hobby = paste(id[type == "hobby"], collapse = ", ")),
            by = .(input = trimws(input))]
#>       input class hobby
#> 1:   sports 1, 34     1
#> 2:    music    34 1, 99
#> 3: knitting           1
 类似资料:
  • 我有一个在不同医院接受治疗的病人的数据集(仅限于住院病人),其中一些分析揭示了几个不一致之处。其中之一是--软件允许病人在不关闭他们之前开放的的情况下入院。 为了更好地理解它,让我们考虑一下示例数据集 如果我们在上面的数据中看到,id为1的患者于1月1日在hospital_1(row-1)入院,并于1月14日出院。出院前患者再次在同一医院入院(第2行);在1月15日(第2行)结束这四项记录之前,再

  • 问题内容: 例如,我有一个像这样的矩阵: 我需要将其转换成这样的矩阵: 实现此目标的最佳方式是什么? 问题答案: 请参阅文章:在JavaScript和jQuery中转置数组

  • 问题内容: 尝试简单地替换一些新行。尝试了3种不同的方法,但我没有任何改变: 这些都应该起作用,但是我仍然可以换行。它们是双精度的:“ \ r \ r”。那不应该让这些失败吗? 问题答案: 已经有在换行符之前 替换 插入* 标签的[]功能: ~~~~* 示例(键盘): 但是,如果仍然无法正常工作,请确保文本被双引号引起来。 那是因为单引号不会“扩展”转义序列,例如与双引号字符串相比。引用PHP文档

  • 本文向大家介绍R子集数据框中的行和列,包括了R子集数据框中的行和列的使用技巧和注意事项,需要的朋友参考一下 示例 语法访问的行和列:[,[[,和$ 本主题涵盖访问数据帧的特定行和列的最常用语法。这些是 就像matrix带单括号的data[rows, columns] 使用行号和列号 使用列(和行)名称 像list: 用单括号data[columns]获取数据框 用双括号data[[one_colu

  • 如何将行交换到列,我有一个输出,如 我需要一个输出比如

  • 问题内容: 我在反转给定的映射并将其反转的键和值存储到另一个映射时遇到了一些麻烦。我有一个方法原型如下: 因此,如果我有向图的样例键如下: 我需要有效地反转该图,以便使d-> b代替b-> d。 我认为这对我来说就是要交换原始图中的值和键,并将它们添加到reverseMap中。我想我可以遍历图中给定键的每组值,然后将它们存储在列表中。 不幸的是,我在实施和思考时遇到了麻烦。我真的很感激朝着正确方向