将一列中的值分隔成多个列名和列值
Separate values in a column into multiple columns name and column value
我想将特定格式的数据从一列拆分为多列。以下是我的示例数据:
df = data.frame(id=c(1,2),data=c('apple:A%1^B%2^C%3_orange:A%1^B%2',
'apple:A%1^B%2^D%3_orange:A%3^B%2'))
# id data
# 1 apple:A%1^B%2^C%3_orange:A%1^B%2
# 2 apple:A%1^B%2^D%3_orange:C%3^B%2
然后将给出以下输出
id data_apple_A data_apple_B data_apple_C data_apple_D data_orange_A data_orange_B
1 1 2 3 1 2
2 1 2 3 1 2
我已经能够做到这一点,但我使用的方法涉及遍历每一行并按每个分隔符执行 str_split 以获得每一行的数据并将其附加到最终输出数据帧,考虑到我将有 500k 行乘以 20 个输入列,这非常慢。
我认为我的 for 循环不是为此用例编写代码的正确 R 方法。任何帮助将不胜感激。
我们可以使用 cSplit
和 str_extract
library(splitstackshape)
library(zoo)
library(stringr)
dt <- cSplit(df, 'data', "\^|_", fixed = FALSE, "long")[, c('grp', 'grp2', 'val')
:= .(na.locf(str_extract(data, "^[A-Za-z]+(?=:)")),
str_extract(data, "[A-Z](?=[%])"), as.numeric(str_extract(data, "\d+"))) ][]
dcast(dt, id ~ paste0("data_", grp) + grp2, value.var = 'val', sep = "_", fill = 0)
# id data_apple_A data_apple_B data_apple_C data_apple_D data_orange_A data_orange_B
#1: 1 1 2 3 0 1 2
#2: 2 1 2 0 3 3 2
我想将特定格式的数据从一列拆分为多列。以下是我的示例数据:
df = data.frame(id=c(1,2),data=c('apple:A%1^B%2^C%3_orange:A%1^B%2',
'apple:A%1^B%2^D%3_orange:A%3^B%2'))
# id data
# 1 apple:A%1^B%2^C%3_orange:A%1^B%2
# 2 apple:A%1^B%2^D%3_orange:C%3^B%2
然后将给出以下输出
id data_apple_A data_apple_B data_apple_C data_apple_D data_orange_A data_orange_B
1 1 2 3 1 2
2 1 2 3 1 2
我已经能够做到这一点,但我使用的方法涉及遍历每一行并按每个分隔符执行 str_split 以获得每一行的数据并将其附加到最终输出数据帧,考虑到我将有 500k 行乘以 20 个输入列,这非常慢。
我认为我的 for 循环不是为此用例编写代码的正确 R 方法。任何帮助将不胜感激。
我们可以使用 cSplit
和 str_extract
library(splitstackshape)
library(zoo)
library(stringr)
dt <- cSplit(df, 'data', "\^|_", fixed = FALSE, "long")[, c('grp', 'grp2', 'val')
:= .(na.locf(str_extract(data, "^[A-Za-z]+(?=:)")),
str_extract(data, "[A-Z](?=[%])"), as.numeric(str_extract(data, "\d+"))) ][]
dcast(dt, id ~ paste0("data_", grp) + grp2, value.var = 'val', sep = "_", fill = 0)
# id data_apple_A data_apple_B data_apple_C data_apple_D data_orange_A data_orange_B
#1: 1 1 2 3 0 1 2
#2: 2 1 2 0 3 3 2