excel 根据实际行的单元格中的数组中的值创建重复行

axzmvihb  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(179)

我有一个数据集,每行都有一个单元格,其中包含一个元素数组。我想把这个数组分成几个独立的元素,按照数组长度的多少来复制行,然后一个一个地填充数组元素。
我有什么:
| 示例柱A|B栏|
| --------------|--------------|
| 名称1|[“A”,“B”,“C”]|
我想要的:
| 示例柱A|B栏|
| --------------|--------------|
| 名称1|“A”|
| 名称1|B|
| 名称1|C|

R或Python代码优先,但Excel也可以工作

yqlxgs2m

yqlxgs2m1#

你可以用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
n8ghc7c1

n8ghc7c12#

此方法的工作流程如下:
1.从stringr包中删除str_replace_all()以删除所有特殊字符

  1. separate_wider_delim()将每个字母分成单独的列
  2. 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”中值的最大长度。

gajydyqb

gajydyqb3#

我知道这不是首选,但在Excel中使用公式,您可以用途:

=LET(string,  B1,
     clean,   MID(string,2,LEN(string)-2),
     split,   TEXTSPLIT(clean,,", "),
HSTACK( EXPAND(A1,
        ROWS(split),
        ,
        A1),
        split))

其中B1中的字符串从第一个和最后一个字符[]中删除。然后拆分成单独字符串的数组。
A1中的值被扩展的次数等于创建的数组的行数。
这两个水平堆叠在一起是所需的结果。

相关问题