繁体   English   中英

使用 R 或 python 将列拆分为多列

[英]Split column to multiple columns by using R or python

我有一个这样的值,我想将它拆分为多列

[['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]

我只是想要这样的价值

'Alonso, O' 'Mizzaro, S' 'Gao, H' 'Barbier, G' 'Goolsby, R'

我如何在 R 或 Python 中使用 RegEx 来做到这一点?

您可以使用扩展方法

initialValue = [['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]

print(initialValue[0])
print(initialValue[1])

x=initialValue[0]
y=initialValue[1]

x.extend(y)

print(x)

这会给你更多的控制,如果你有多个列表要使用,你可以使用循环。

如果正则表达式不是强制性的,这可能会有所帮助。 python的解决方案。

a = [['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]
output = ""
for each in a:
    output += " ".join(each)

输出: 'Alonso, O. Mizzaro, S.Gao, H. Barbier, G. Goolsby, R.'

这是在python中执行此操作的方法

cols = [['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]

answer_list = [word for lists in cols for word in lists]

answer = ''.join(answer_list)

一个 tidyverse 尝试,在 R 中:

第一部分
我假设这个值是例如向量中的字符值。
因此,我将您的值加载到这样的向量中:

char <- "[['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]"

然后,如果您想将它们拆分为单独的名称,生成一个包含五个名称作为单独值的向量,您可以执行以下操作:

char %>% 
  str_replace_all("'|\\[|\\]", "") %>% 
  str_split("\\., ") %>% 
  unlist()

输出:

[1] "Alonso, O"   "Mizzaro, S"  "Gao, H"      "Barbier, G"  "Goolsby, R."

它的作用是:
1. 使用字符串“'|\\[|\\]”去掉所有的''s, ['s and ]'s。 方括号需要转义,因此双\\; “|” 是或
2.根据字符串“.,”进行拆分。 在这种情况下,该字符串中的点需要转义,因为我们希望将它用作常规点,而不是特殊字符点。
3. unlist,在这种情况下变成五个名字的向量。
我为此使用了 tidyverse 的两个软件包,因此请确保将 tidyverse 安装和加载为一个整体,或者至少是 stringr 和 magrittr

第二部分
其次,我注意到在你的标题中你提到将它分成几列。
如果这是变量中的值,需要将其拆分为五列中的五个值,您可以使用类似的方法。

char %>% 
  enframe(name = NULL) %>% 
  mutate(value = str_replace_all(value, "'|\\[|\\]", "")) %>% 
  separate(value, into = c("name1", "name2", "name3", "name4", "name5"), sep = "\\., ")

输出:

# A tibble: 1 x 5
  name1     name2      name3  name4      name5      
  <chr>     <chr>      <chr>  <chr>      <chr>      
1 Alonso, O Mizzaro, S Gao, H Barbier, G Goolsby, R.

这段代码解释了:
1. 将char向量转成tibble,在本例中将字符值放入名为“value”的变量中(默认名称)
2. 再次从第一部分开始第 1 步,去掉 ''s、['s 和 ]'s,但这次作为 mutate 调用的一部分
3. 代替str_split,您现在使用separate 将列中的值分隔为多个列上的单独值。 您必须提供一些您认为您的值将被拆分的列名(“into = ”参数),以及要分隔的字符串(与第一部分中的步骤 2 相同的字符串)。

为此,您需要三个额外的 tidyverse 包:tibble、dplyr 和 tidyr

给定字符串s <- "[['Alonso, O.', 'Mizzaro, S.'], ['Gao, H.', 'Barbier, G.', 'Goolsby, R.']]" ,那么你可以使用下面的代码来制作它,即,

r <- unlist(regmatches(s,gregexpr("\\'.*?\\'",s)))

以至于

> cat(r)
'Alonso, O.' 'Mizzaro, S.' 'Gao, H.' 'Barbier, G.' 'Goolsby, R.'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM