R语言 如何高效地将数据框架的两个部分堆叠在一起,并使用不同的列名?

s3fp2yjn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(81)

问题:

我如何获取一个包含成对数据(但列名不同)的 Dataframe 并有效地合并它?(解决方案不需要是tidyverse)。

启动数据框:

我在一个数据框架中有源/目标对信息,像这样...

library(tidyverse)

df <- tibble(orig_city = c("Philadelphia", "Orlando", "Los Angeles"),
          orig_state = c("PA", "FL", "CA"),
          orig_zip = c("21948", "48321", "98765"),
          dest_city = c("Boston", "St Louis", "Houston"),
          dest_state = c("MA", "MO", "TX"),
          dest_zip = c("12345", "67890", "45678"))
> df
# A tibble: 3 × 6
  orig_city    orig_state orig_zip dest_city dest_state dest_zip
  <chr>        <chr>      <chr>    <chr>     <chr>      <chr>   
1 Philadelphia PA         21948    Boston    MA         12345   
2 Orlando      FL         48321    St Louis  MO         67890   
3 Los Angeles  CA         98765    Houston   TX         45678

...我需要获取每个城市的地理位置数据,但这些信息并不取决于它是起点还是目的地,所以我想将其堆叠起来,并在一组列中进行处理。这里有一个方法可以用正确的输出来解决我的问题:

所需数据框

df_stacked1 <- tibble(city = c(df$orig_city, df$dest_city),
                     state = c(df$orig_state, df$dest_state),
                     zip = c(df$orig_zip, df$dest_zip))
> df_stacked1
# A tibble: 6 × 3
  city         state zip  
  <chr>        <chr> <chr>
1 Philadelphia PA    21948
2 Orlando      FL    48321
3 Los Angeles  CA    98765
4 Boston       MA    12345
5 St Louis     MO    67890
6 Houston      TX    45678

虽然这是可行的,但它并没有很好地缩放,如果我说... 15对而不是3对。
我有另一个使用rbind()的解决方案,但这需要名称匹配,虽然它可以更好地扩展,我想知道是否有更好的方法,我还没有找到。

备用工作液

df_orig <- df[, 1:3]
colnames(df_orig) <- gsub("orig_", "", colnames(df_orig))
df_dest <- df[, 4:6]  
colnames(df_dest) <- gsub("dest_", "", colnames(df_dest))
df_stacked2 <- rbind(df_orig, df_dest)
> df_stacked2
# A tibble: 6 × 3
  city         state zip  
  <chr>        <chr> <chr>
1 Philadelphia PA    21948
2 Orlando      FL    48321
3 Los Angeles  CA    98765
4 Boston       MA    12345
5 St Louis     MO    67890
6 Houston      TX    45678

提前感谢您的任何建议。

t8e9dugd

t8e9dugd1#

df |> 
  tidyr::pivot_longer(everything(),  
                      names_to = c("set", ".value"), 
                      names_sep = "_",
                      cols_vary = "slowest")

# A tibble: 6 x 4
  set   city         state zip  
  <chr> <chr>        <chr> <chr>
1 orig  Philadelphia PA    21948
2 orig  Orlando      FL    48321
3 orig  Los Angeles  CA    98765
4 dest  Boston       MA    12345
5 dest  St Louis     MO    67890
6 dest  Houston      TX    4567

字符串

相关问题