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"))
如何将 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"))