R:将一个数据框中的行数据按组转换为另一个数据框中的列数据

标签 r dataframe dplyr simplify

我有以下格式的数据:

<表类="s-表"> <头> 身份证 年龄 性别 <正文> 1 29 M 2 32 F 3 18 F 4 89 M 5 45 M

和;

<表类="s-表"> <头> 身份证 子ID 类型 状态 年 <正文> 1 3 汽车 是 1 11 丰田 空 2011 1 23 起亚 空 2009 2 5 汽车 N 3 2 汽车 是 3 4 本田 空 2019 3 7 法币 空 2006 3 8 三菱 空 2020 4 1 汽车 N 5 7 汽车 是

第二个表中的每个 ID 都有一行指定他们是否有汽车,另外还有一行说明他们拥有的汽车品牌。每个人最多拥有3辆车。我想将这些数据简化到一个表中。

<表类="s-表"> <头> 身份证 年龄 性别 汽车? Car.1 Car1.year Car.2 Car2.year Car.3 Car3.year <正文> 1 29 M 是 丰田 2011 起亚 2009 空 空 2 32 F N 空 空 空 空 空 空 3 18 F 是 本田 2019 法币 2006 三菱 2020 4 89 M N 空 空 空 空 空 空 5 45 M 是 空 空 空 空 空 空

我已经尝试将 dplyr 中的 mutate 函数与 case_when 函数一起使用,但我无法检查另一个数据帧中的条件。如果我尝试将表连接在一起,我会为每个 ID 设置多行,这是我想避免的。第二张表的非标准设置使事情变得复杂。我唯一剩下的想法是切换到 Python/Pandas 并创建一个 for 循环,慢慢循环遍历每个 ID,如果此人有汽车和汽车品牌,则搜索第二个数据框,然后改变第一个数据框中的列。但考虑到我的数据集的大小,这将是低效的并且需要很长时间。

执行此操作的最佳方法是什么?

最佳答案

你可以试试下面的代码:

library(tidyverse)

df1

# A tibble: 5 x 3
     ID   Age Sex  
  <dbl> <dbl> <chr>
1     1    29 M    
2     2    32 F    
3     3    18 F    
4     4    89 M    
5     5    45 M  

df2

# A tibble: 10 x 5
      ID subID Type       Status  Year
   <dbl> <dbl> <chr>      <chr>  <dbl>
 1     1     3 Car        Y         NA
 2     1    11 Toyota     Y       2011
 3     1    23 Kia        Y       2009
 4     2     5 Car        N         NA
 5     3     2 Car        Y         NA
 6     3     4 Honda      Y       2019
 7     3     7 Fiat       Y       2006
 8     3     8 Mitsubishi Y       2020
 9     4     1 Clothed    N         NA
10     5     7 Clothed    Y         NA


df2 <- df2 %>% mutate(Status = if_else(Status == "NULL", "Y", Status))
df3 <- df2 %>% filter(!is.na(Year)) %>% group_by(ID) %>% mutate(index = row_number())  
df4 <- df3  %>% pivot_wider(id_cols = c(ID), values_from = c(Type, Year), names_from = index ) 

因此将产生您想要的输出:

df1 %>% left_join(df2 %>% select(ID, Status) %>% distinct()) %>% left_join(df4) 

# A tibble: 5 x 10
     ID   Age Sex   Status Type_1 Type_2 Type_3     Year_1 Year_2 Year_3
  <dbl> <dbl> <chr> <chr>  <chr>  <chr>  <chr>       <dbl>  <dbl>  <dbl>
1     1    29 M     Y      Toyota Kia    NA           2011   2009     NA
2     2    32 F     N      NA     NA     NA             NA     NA     NA
3     3    18 F     Y      Honda  Fiat   Mitsubishi   2019   2006   2020
4     4    89 M     N      NA     NA     NA             NA     NA     NA
5     5    45 M     Y      NA     NA     NA             NA     NA     NA

关于R:将一个数据框中的行数据按组转换为另一个数据框中的列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71100301/

相关文章:

python - 在构造函数中子类化 Pandas 数据框和设置字段

r - 共现变量对的交叉制表

r - 如何找到二进制文件的长度

r - 在 Shiny 的两个 tabPanel 中绘制相同的输出

R从列表中提取数据帧,列名中没有前缀

python - 从 DataFrame 中选择属于同一系列的行的最后一次观察

r - dplyr::lead 或 data.table::shift 引用变量值而不是标量

r - 连接 R 中两个值之间最接近的值

r - 安装软件包时,.onLoad 在 loadNamespace() 中失败( 'rJava')

r - 为什么testthat 2.3.2使用了不同的sort()