R:用于分隔键值对中新列的数据框

R: dataframe to separate new column in key-value pairs

如何将 R 数据帧行连接到单独的新列作为键值对。到目前为止我尝试了一些但没有成功。

      city  rev qty   zip
1  Atlanta 63.0   1 45987
2 New York 10.6   1 12686
3  Atlanta 12.0   1 74268
4    Tampa  3.0   1 33684

将上述数据帧转换为

      city  rev qty   zip   key_value
1  Atlanta 63.0   1 45987   city=Atlanta;rev=63.0;qty=1;zip=45987
2 New York 10.6   1 12686   city=New York;rev=10.60;qty=1;zip=12686
3  Atlanta 12.0   1 74268   city=Atlanta;rev=12.0;qty=1;zip=74268
4    Tampa  3.0   1 33684   city=Tampa;rev=3.0;qty=1;zip=33684

您可以使用 apply -

按行 paste 值和列名
df$key_value <- apply(df, 1, function(x) 
                      paste(names(x), x, sep = '=', collapse = ';'))
df

#     city  rev qty   zip                             key_value
#1 Atlanta 63.0   1 45987 city=Atlanta;rev=63.0;qty=1;zip=45987
#2 NewYork 10.6   1 12686 city=NewYork;rev=10.6;qty=1;zip=12686
#3 Atlanta 12.0   1 74268 city=Atlanta;rev=12.0;qty=1;zip=74268
#4   Tampa  3.0   1 33684   city=Tampa;rev= 3.0;qty=1;zip=33684

我们可以在 tidyverse

中做到这一点
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
    mutate(across(everything(), ~ str_c(cur_column(), "=", .), 
    .names = "{.col}_new")) %>% 
   unite(key_value, ends_with('new'), sep=";")
      city  rev qty   zip                              key_value
1  Atlanta 63.0   1 45987    city=Atlanta;rev=63;qty=1;zip=45987
2 New York 10.6   1 12686 city=New York;rev=10.6;qty=1;zip=12686
3  Atlanta 12.0   1 74268    city=Atlanta;rev=12;qty=1;zip=74268
4    Tampa  3.0   1 33684       city=Tampa;rev=3;qty=1;zip=33684

数据

df1 <- structure(list(city = c("Atlanta", "New York", "Atlanta", "Tampa"
), rev = c(63, 10.6, 12, 3), qty = c(1L, 1L, 1L, 1L), zip = c(45987L, 
12686L, 74268L, 33684L)), class = "data.frame", row.names = c("1", 
"2", "3", "4"))