我有一个dataframe,我想分隔一个包含月份和年份的列:
library(tidyverse)
df <- data.frame(
month_year = c("Januar / Janvier 1990", "Februar / Février 1990","März / Mars 1990")
)
# df
# month_year
# 1 Januar / Janvier 1990
# 2 Februar / Février 1990
# 3 März / Mars 1990
下面的工作,但似乎有点笨拙:
df %>%
separate(month_year, c("month","nothing","nothing2", "year"), sep = " ") %>%
select(-starts_with("nothing"))
# month year
# 1 Januar 1990
# 2 Februar 1990
# 3 März 1990
是否有更简洁的选项来实现相同的结果?
5条答案
按热度按时间8qgya5xd1#
1)separate使用NA省略不需要的字段,如下所示:
@Otto指出,这在UTF8中存在问题。如果是这种情况,请添加显示的sep=值。
separate
使用默认值"[^[:alnum:]]+"
,它不处理UTF8,但我们可以指定以下任意一种:"[^\\p{L}\\d]+"
。这将"[:alnum:]"
替换为"\\p{L}"
,"\\p{L}"
是任何语言中的任何字母,"\\d"
是任何数字,或"(*UCP)[^[:alnum:]]+"
,使用unicode说明符作为前缀这是一个例子。首先,我们创建一个显示问题的输入df 2,然后使用上面两个sep值之一。
2)读取.table,这里是一个基本解决方案:
3)read.pattern这将使用read. pattern挑选出所需的字段。
(\\w+)
捕获第一个单词,(\\d+)
捕获年份。2guxujil2#
base R
也许有点笨拙:
dplyr
使用不同的正则表达式,对代码进行 * 非常轻微 * 的缩减:
或
p1iqtdky3#
我们可以使用
stringr
包中的word
:kx5bkwkv4#
尝试使用以下基本R代码
read.table
+gsub
它给出了
xxe27gdn5#
Tidyverse + stringr
'\\d+'
捕获所有数字;[^ /]
捕获第一次出现/
之前的子字符串。