将具有重复A列值的data.frame转换为转置的data.frame
我有一个银行Excel,它给了我这样的信息:将具有重复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
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函数出现问题时会给我一个错误