首页 > 解决方案 > 如何将某些行转换为 R 中的列?

问题描述

我有一个如下所示的数据框:

`Row Labels` Female Male 
  <chr>      <chr>  <chr>
 1 London     <NA>   <NA> 
 2 42         <NA>   1    
 3 Paris      <NA>   <NA> 
 4 36         1      <NA> 
 5 Belgium    <NA>   <NA> 
 6  18                 1
 7 21         <NA>   1    
 8 Madrid    <NA>   <NA> 
 9 20         1      <NA>  
 10 Berlin     <NA>   <NA> 
 11 37         <NA>   1 
 12 23          1
 13 25          1
 14 44          1

我用来生成此数据框的代码如下所示:

structure(list(`Row Labels` = c("London", "42", "Paris","36", "Belgium","18" ,"21", "Madrid", "20", "Berlin", "37","23","25","44"), 
Female = c(NA, NA, NA, "1", NA, NA,NA, NA, "1", NA, NA,"1","1","1"), Male = c(NA,"1", NA, NA, NA, "1", NA, NA, NA, "1",NA,NA,NA,NA)), 
.Names = c("Row Labels","Female", "Male"), row.names = c(NA, -14L), class = c("tbl_df", "tbl", "data.frame"))

我想知道如何将这个数据框中的多行更改为列。

我的理想输出如下所示:

'Row Labels' Female Male 42 36 21 20 37  18  23 25 44
 London              1   1
 Paris         1             1
 Belgium       1       1         1        1
Madrid         1                   1
Berlin         3       1              1      1  1   1

标签: r

解决方案


看起来很机械。调用您的数据d

d1 = d[seq(1, nrow(d), by = 2), ]
d2 = d[seq(2, nrow(d), by = 2), ]
d1[, c("Male", "Female")] = d2[, c("Male", "Female")]
d3 = matrix(nrow = nrow(d2), ncol = nrow(d2))
diag(d3) = 1
colnames(d3) = d2$`Row Labels`

cbind(d2, d3)
#   Row Labels Female Male 42 36 21 20 37
# 1         42   <NA>    1  1 NA NA NA NA
# 2         36      1 <NA> NA  1 NA NA NA
# 3         21   <NA>    1 NA NA  1 NA NA
# 4         20      1 <NA> NA NA NA  1 NA
# 5         37   <NA>    1 NA NA NA NA  1

推荐阅读