将具有重复A列值的data.frame转换为转置的data.frame

将具有重复A列值的data.frame转换为转置的data.frame,r,dataframe,dplyr,split,tidyverse,R,Dataframe,Dplyr,Split,Tidyverse,我有一个银行Excel,它给了我这样的信息: A B C Name XYZ trash Date 20/05/31 trash Amount trash 0.01 Name ABC trash Date 20/06/30 trash Amount trash 0.02 Name KLM trash Date 20/07/29 trash Amount

我有一个银行Excel,它给了我这样的信息:

A        B         C
Name     XYZ       trash
Date     20/05/31  trash
Amount   trash     0.01
Name     ABC       trash
Date     20/06/30  trash
Amount   trash     0.02
Name     KLM       trash
Date     20/07/29  trash
Amount   trash     -0.03
我想要的结果是:

Name  Date      Amount
XYZ   20/05/31  0.01
ABC   20/06/30  0.02
KLM   20/07/29  -0.03
为了清洁df,我使用了:

如何拆分和转置?这是最好的方式吗

Ps:使用readxl,我收到以下警告:未知或未初始化列:“数据”

尝试以下操作:

df%>% 变异所有~if_else.==垃圾,NA_字符,.%>% 变异 grp=cumsumA==Name, B=聚结B,C %>% 选择-C%>% pivot\u-widergrp,名称\u-from=A,值\u-from=B%>% 变异 日期=as.DateDate,格式=%y/%m/%d, Amount=as.numericAmount %>% 选择玻璃钢 一个tibble:3x3 姓名日期金额 1 XYZ 2020-05-31 0.01 2 ABC 2020-06-30 0.02 3荷航2020-07-29-0.03 假设:

每3组行始终以名称开头;和 B或C中都有可用数据,而不是两者都有。 我想你会希望Date成为R。。。如果希望保留字符串,请忽略该选项。

尝试以下操作:

df%>% 变异所有~if_else.==垃圾,NA_字符,.%>% 变异 grp=cumsumA==Name, B=聚结B,C %>% 选择-C%>% pivot\u-widergrp,名称\u-from=A,值\u-from=B%>% 变异 日期=as.DateDate,格式=%y/%m/%d, Amount=as.numericAmount %>% 选择玻璃钢 一个tibble:3x3 姓名日期金额 1 XYZ 2020-05-31 0.01 2 ABC 2020-06-30 0.02 3荷航2020-07-29-0.03 假设:

每3组行始终以名称开头;和 B或C中都有可用数据,而不是两者都有。
我想你会希望Date成为R。。。如果希望保留字符串,请忽略此项。

我们可以获取长格式的数据,删除“垃圾”值,创建一个包含“名称”值的组,并获取宽格式的数据

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -A) %>%
  filter(value != 'trash') %>%
  select(-name) %>%
  group_by(grp = cumsum(A == 'Name')) %>%
  pivot_wider(names_from = A, values_from = value) %>%
  ungroup %>%
  select(-grp) %>% type.convert(as.is = TRUE)


# A tibble: 3 x 3
#  Name  Date     Amount
#  <chr> <chr>     <dbl>
#1 XYZ   20/05/31   0.01
#2 ABC   20/06/30   0.02
#3 KLM   20/07/29  -0.03

我们可以获取长格式的数据,删除“垃圾”值,创建一个出现“名称”值的组,并获取宽格式的数据

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -A) %>%
  filter(value != 'trash') %>%
  select(-name) %>%
  group_by(grp = cumsum(A == 'Name')) %>%
  pivot_wider(names_from = A, values_from = value) %>%
  ungroup %>%
  select(-grp) %>% type.convert(as.is = TRUE)


# A tibble: 3 x 3
#  Name  Date     Amount
#  <chr> <chr>     <dbl>
#1 XYZ   20/05/31   0.01
#2 ABC   20/06/30   0.02
#3 KLM   20/07/29  -0.03
下面是一种使用data.table的方法:

这是x:

 x <- structure(list(A = c("Name", "Date", "Amount", "Name", "Date",                             
     "Amount", "Name", "Date", "Amount"), B = c("XYZ", "20/05/31",                               
     "trash", "ABC", "20/06/30", "trash", "KLM", "20/07/29", "trash"                             
     ), C = c("trash", "trash", "0.01", "trash", "trash", "0.02",                                
     "trash", "trash", "-0.03")), row.names = c(NA, 
     9L), class = c("data.table", "data.frame"))  
下面是一种使用data.table的方法:

这是x:

 x <- structure(list(A = c("Name", "Date", "Amount", "Name", "Date",                             
     "Amount", "Name", "Date", "Amount"), B = c("XYZ", "20/05/31",                               
     "trash", "ABC", "20/06/30", "trash", "KLM", "20/07/29", "trash"                             
     ), C = c("trash", "trash", "0.01", "trash", "trash", "0.02",                                
     "trash", "trash", "-0.03")), row.names = c(NA, 
     9L), class = c("data.table", "data.frame"))  

非常感谢你!所有的答案都解决了我的问题。我不清楚垃圾的事。。这不是一个垃圾词,而是一些不重要或没有数据的数据。。非常喜欢@a5c1d2h2i1m1n2o1r2t1简短的答案,但由于它是一个Excel数据,总是会有一些问题,例如数量会翻倍,因此我将使用@ronak shah的group\u by/pivot\u wider/ungroup组合,这在pivot\u wider函数出现问题时会给我一个错误,非常感谢!所有的答案都解决了我的问题。我不清楚垃圾的事。。这不是一个垃圾词,而是一些不重要或没有数据的数据。。我非常喜欢@a5c1d2h2i1m1n2o1r2t1的简短回答,但由于它是一个Excel数据,总是会有一些问题,比如数量增加一倍,因此我将使用@ronak shah的group_by/pivot_wired/ungroup组合,这在pivot_wired函数出现问题时会给我一个错误