如果任何行在某些列中包含相同的数据,则将该行中的其他列移动到R中的新列中

wkyowqbh  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(128)

样本数据:

df<-data.frame(Country = c("FR", "FR", "US", "US", "US", "US", "AU", "UK", "UK", "UK"), 
Name = c("Jean","Jean","Rose","Rose","Rose","Rose","Liam","Mark","Mark","Mark"),
A=c(2,NA,NA,1,3,NA,1,2,NA,NA),
B=c(2,5,NA,1,NA,2,1,NA,3,NA),
C=c(2,NA,4,1,NA,NA,NA,NA,NA,NA),
D=c(NA,3,NA,NA,4,4,1,2,4,4))
Input:   
  Country Name   A  B  C  D  
1      FR Jean   2  2  2  NA 
2      FR Jean   NA 5  NA 3  
3      US Rose   NA NA 4  NA 
4      US Rose   1  1  1  NA 
6      US Rose   3  NA NA 4  
7      US Rose   NA 2  NA 4  
8      AU Liam   1  1  NA 1  
9      UK Mark   2  NA NA 2  
10     UK Mark   NA 3  NA 4  
11     UK Mark   NA NA NA 4  

Desired output:
  Country Name   A  B  C  D  A  B  C  D  A  B  C  D  A  B  C  D 
1      FR Jean   2  2  2  NA NA 5  NA 3
2      US Rose   NA NA 4  NA 1  1  1  NA 3  NA NA 4  NA 2  NA 4    
3      AU Liam   1  1  NA 1  
4      UK Mark   2  NA NA 2  NA 3  NA 4  NA NA NA 4

从数据中可以看出,目标是:

  • 如果"国家/地区"和"名称"在后面的每一行中包含相同的数据,请将这些行中的列jian biao中的数据移动到新的jian biao列中。
  • 我拥有的实际表并不只包含11行。在后续行中(第11行之后),Country和Name数据可能会重复1、2、3、... n次。我如何创建一个CONDITIONAL,以便只要下面的行相同,就自动移动ABCD中的数据以创建新的ABCD列?
svujldwt

svujldwt1#

你不能有两个同名的列。我不知道这是否对你有帮助,但你可以这样做:
编号

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(cols = A:D) %>%
  group_by(Country,name) %>% 
  mutate(name = paste0(name,row_number())) %>% 
  pivot_wider(names_from = name,values_from = value)

输出

# A tibble: 4 x 18
# Groups:   Country [4]
  Country Name     A1    B1    C1    D1    A2    B2    C2    D2    A3    B3    C3    D3    A4    B4
  <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 FR      Jean      2     2     2    NA    NA     5    NA     3    NA    NA    NA    NA    NA    NA
2 US      Rose     NA    NA     4    NA     1     1     1    NA     3    NA    NA     4    NA     2
3 AU      Liam      1     1    NA     1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
4 UK      Mark      2    NA    NA     2    NA     3    NA     4    NA    NA    NA     4    NA    NA
# ... with 2 more variables: C4 <dbl>, D4 <dbl>
u59ebvdq

u59ebvdq2#

  • 可以 * 具有 * 同名 * 的 * 列,但不建议这样做。
. <- split(df[-1:-2], df[1:2], TRUE)
. <- lapply(., \(x) c(t(x)))
. <- do.call(rbind, lapply(., `length<-`, max(lengths(.))))
colnames(.) <- rep(names(df)[-1:-2], length.out=ncol(.))
cbind(df[match(row.names(.), interaction(df[1:2], drop=TRUE)), 1:2], .)
#  Country Name  A  B  C  D  A  B  C  D  A  B  C  D  A  B  C  D
#1      FR Jean  2  2  2 NA NA  5 NA  3 NA NA NA NA NA NA NA NA
#7      AU Liam  1  1 NA  1 NA NA NA NA NA NA NA NA NA NA NA NA
#8      UK Mark  2 NA NA  2 NA  3 NA  4 NA NA NA  4 NA NA NA NA
#3      US Rose NA NA  4 NA  1  1  1 NA  3 NA NA  4 NA  2 NA  4

相关问题