我有一个数据框,我想在其中分隔包含月份和年份的列:
\nlibrary(tidyverse)\ndf <- data.frame(\n month_year = c("Januar / Janvier 1990", "Februar / F\xc3\xa9vrier 1990","M\xc3\xa4rz / Mars 1990")\n)\n\n# df\n# month_year\n# 1 Januar / Janvier 1990\n# 2 Februar / F\xc3\xa9vrier 1990\n# 3 M\xc3\xa4rz / Mars 1990\nRun Code Online (Sandbox Code Playgroud)\n以下内容有效,但看起来有点笨拙:
\ndf %>% \n separate(month_year, c("month","nothing","nothing2", "year"), sep = " ") %>%\n select(-starts_with("nothing"))\n\n# month year\n# 1 Januar 1990\n# 2 Februar 1990\n# 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n是否有更简洁的选择来达到相同的结果?
\nG. *_*eck 11
1) 单独使用 NA 省略不需要的字段,如下所示:
\nlibrary(tidyr)\n\ndf %>% separate(month_year, c("month", NA, "year"))\n## month year\n## 1 Januar 1990\n## 2 Februar 1990\n## 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n@Otto 指出这在 UTF8 中存在问题。如果这是您的情况,请添加显示的 sep= 值。 separate使用默认值,"[^[:alnum:]]+"它不处理 UTF8,但我们可以指定其中一个:
"[^\\\\p{L}\\\\d]+"。它替换"[:alnum:]"为"\\\\p{L}"任何语言中的任何字母和"\\\\d"任何数字,或者"(*UCP)[^[:alnum:]]+"它使用 unicode 说明符作为前缀这显示了一个例子。首先,我们创建一个显示问题的输入 df2,然后我们使用上面两个 sep 值之一。
\ndf <- data.frame(\n month_year = c("Januar / Janvier 1990", "Februar / F\xc3\xa9vrier 1990","M\xc3\xa4rz / Mars 1990"))\ndf2 <- df %>% mutate(month_year = iconv(month_year, to = "UTF8"))\n\ndf2 %>% separate(month_year, c("month", NA, "year"), sep = "[^\\\\p{L}\\\\d]+")\n## month year\n## 1 Januar 1990\n## 2 Februar 1990\n## 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n2)read.table,这是一个基本解决方案:
\nread.table(text = df[[1]], col.names = c("month", NA, NA, "year"))[-(2:3)]\n## month year\n## 1 Januar 1990\n## 2 Februar 1990\n## 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n3) read.pattern这使用read.pattern挑选出所需的字段。(\\\\w+)捕获第一个单词并(\\\\d+)捕获年份。
library(gsubfn)\n\npat <- "(\\\\w+).* (\\\\d+)"\nread.pattern(text = df[[1]], pattern = pat, col.names = c("month", "year"))\n## month year\n## 1 Januar 1990\n## 2 Februar 1990\n## 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n
strcapture("^(.*)\\\\s+/.*\\\\s+([^\\\\s]+)$", df$month_year, proto = c(month="", year=1L))\n# month year\n# 1 Januar 1990\n# 2 Februar 1990\n# 3 M\xc3\xa4rz 1990\nRun Code Online (Sandbox Code Playgroud)\n也许有点笨拙:
\nsetNames(do.call(rbind.data.frame,\n lapply(strsplit(df$month_year, "\\\\s+"), function(z) z[c(1, length(z))])),\n c("month", "year"))\nRun Code Online (Sandbox Code Playgroud)\n使用不同的正则表达式稍微减少代码:
\nlibrary(dplyr)\ndf %>%\n separate(month_year, c("month", "ign", "year"), "[ /]+") %>%\n select(-ign)\nRun Code Online (Sandbox Code Playgroud)\n或者
\ndf %>%\n mutate(month_year = gsub("/.* ", "", month_year)) %>%\n separate(month_year, c("month", "year"), " ")\nRun Code Online (Sandbox Code Playgroud)\n