我有一个数据集,每行都有一个单元格,其中包含一个元素数组。我想把这个数组分成几个独立的元素,按照数组长度的多少来复制行,然后一个一个地填充数组元素。我有什么:| 示例柱A|B栏|| --------------|--------------|| 名称1|[“A”,“B”,“C”]|我想要的:| 示例柱A|B栏|| --------------|--------------|| 名称1|“A”|| 名称1|B|| 名称1|C|
R或Python代码优先,但Excel也可以工作
yqlxgs2m1#
你可以用data.table来实现。
data.table
df = data.table(colA = "name 1", colB = "[\"A\", \"B\", \"C\"]") df[,.(colA, colB = sapply(tstrsplit(gsub("[[:punct:]]","",colB)," "), `[` ))]
输出
colA colB <char> <char> 1: name 1 A 2: name 1 B 3: name 1 C
n8ghc7c12#
此方法的工作流程如下:1.从stringr包中删除str_replace_all()以删除所有特殊字符
stringr
str_replace_all()
separate_wider_delim()
pivot_longer()
library(stringr) library(dplyr) library(tidyr) # Example dataframe based on your example df <- data.frame(colA = "name 1", colB = "[\"A\", \"B\", \"C\"]") df %>% mutate(colB = str_replace_all(colB, "[[:punct:]]", "")) %>% separate_wider_delim(colB, " ", names = c(paste0("col", (1:3))), too_few = "align_start") %>% pivot_longer(!colA, values_to = "colB") %>% select(-name) # A tibble: 3 × 2 # colA colB # <chr> <chr> # 1 name 1 A # 2 name 1 B # 3 name 1 C # Example dataframe with varying list lengths (in case values in "colB" vary) df <- data.frame(colA = c("name 1", "name 2"), colB = c("[\"A\", \"B\", \"C\"]", "[\"A\", \"B\", \"C\"], \"D\"]")) df %>% mutate(colB = str_replace_all(colB, "[[:punct:]]", "")) %>% separate_wider_delim(colB, " ", names = c(paste0("col", (1:4))), too_few = "align_start") %>% pivot_longer(!colA, values_to = "colB") %>% filter(!is.na(colB)) %>% select(-name) # A tibble: 7 × 2 # colA colB # <chr> <chr> # 1 name 1 A # 2 name 1 B # 3 name 1 C # 4 name 2 A # 5 name 2 B # 6 name 2 C # 7 name 2 D
请注意,如果“colB”中的字符长度不同,则too_few = "align_start"用于。此外,您可能需要编辑names = c(paste0("col", (1:n))),其中n是“colB”中值的最大长度。
too_few = "align_start"
names = c(paste0("col", (1:n)))
gajydyqb3#
我知道这不是首选,但在Excel中使用公式,您可以用途:
=LET(string, B1, clean, MID(string,2,LEN(string)-2), split, TEXTSPLIT(clean,,", "), HSTACK( EXPAND(A1, ROWS(split), , A1), split))
其中B1中的字符串从第一个和最后一个字符[和]中删除。然后拆分成单独字符串的数组。A1中的值被扩展的次数等于创建的数组的行数。这两个水平堆叠在一起是所需的结果。
B1
[
]
3条答案
按热度按时间yqlxgs2m1#
你可以用
data.table
来实现。输出
n8ghc7c12#
此方法的工作流程如下:
1.从
stringr
包中删除str_replace_all()
以删除所有特殊字符separate_wider_delim()
将每个字母分成单独的列pivot_longer()
为每组的每个值创建行请注意,如果“colB”中的字符长度不同,则
too_few = "align_start"
用于。此外,您可能需要编辑names = c(paste0("col", (1:n)))
,其中n是“colB”中值的最大长度。gajydyqb3#
我知道这不是首选,但在Excel中使用公式,您可以用途:
其中
B1
中的字符串从第一个和最后一个字符[
和]
中删除。然后拆分成单独字符串的数组。A1中的值被扩展的次数等于创建的数组的行数。
这两个水平堆叠在一起是所需的结果。