字符串拆分

String spliting

提问人:Vida Beach 提问时间:10/10/2023 最后编辑:r2evansVida Beach 更新时间:10/11/2023 访问量:65

问:

R 中是否有功能可以执行以下操作:

我有列,其中每行都有字符串,其中单词(国家)用逗号分隔。但我想做一个新的专栏,它有那些相同的国家,但给了我以下

我用其中一行举例

old column value "Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome"
new column value "Eesti, Soome, Eesti, Soome, Eesti, Soome" 

col1 <- 1:2
col2 <- c("Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome", "Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti")

dt <- data.frame(PERSON_ID = col1,
COUNTRIES = col2)

dt
# PERSON_ID, COUNTRIES
# 1 Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome
# 2 Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti

但是我想添加新列,我可以在其中拥有一些东西,这些列在COUNTRIES2中,所以我的意思是 col3 变量

col3 <- c("Eesti, Soome, Eesti, Soome, Eesti, Soome", "Ukraina, Eesti, Luksembourg, Eesti")

# PERSON_ID, COUNTRIES, COUNTRIES2
# 1 Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome   Eesti, Soome, Eesti, Soome, Eesti, Soome
# 2 Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti    Ukraina, Eesti, Luksembourg, Eesti


我尝试过多种方法。

R 字符串 拆分

评论

1赞 LMc 10/11/2023
请阅读有关如何制作出色的 R 可重现示例的信息,并相应地更新您的问题。通过将 的输出粘贴到您的帖子中,或者如果您有一个大型数据框,则包含您的数据示例。此外,还包括您尝试过的代码、任何相关错误和预期输出。如果无法发布数据,请发布用于创建代表性数据的代码。不要发布代码和/或数据的图像dput(<your data frame>)dput(head(<your data frame>))
5赞 Gregor Thomas 10/11/2023
你的问题一点也不清楚。请对其进行编辑,以提供用于创建示例输入的 R 代码,并以更清晰的方式显示示例输出。我无法判断您的值是需要编辑的一个字符串,还是需要过滤的数据框的多行等。

答:

1赞 Andrew Gustar 10/11/2023 #1

在基础 R 中,你可以做这样的事情......

df <- data.frame(string = "Eesti, Soome, Soome, Soome, Eesti, 
                           Soome, Eesti, Eesti, Eesti, Soome")

df$y <- sapply(df$string, \(x) paste(rle(unlist(strsplit(x, ", ")))$values,
                                     collapse = ", "))

df$y
[1] "Eesti, Soome, Eesti, Soome, Eesti, Soome"

这会拆分字符串 at 并应用执行 run-length-encoding 的函数。的输出是一个列表,其中包括指定每次运行的值。然后,这些值将作为单个字符串粘贴在一起。将此函数应用于 DataFrame 列的每个元素。, rlerle$valuesapply

评论

3赞 r2evans 10/11/2023
代码高尔夫,paste(..., collapse = ", ") --> toString(...)
0赞 margusl 10/11/2023 #2

我们可以先用 拆分输入列中的字符串,这将生成一个拆分列表;应用于列表中的每个项目 through 生成一个运行长度编码对象列表,从中我们只保留向量;作为最后一步,我们将把列表中的所有这些向量折叠在一起,现在得到一个向量而不是列表。strsplit()rle()lapply()valuessapply()

col1 <- 1:2
col2 <- c("Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome", 
          "Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti")
dt <- data.frame(PERSON_ID = col1,
                 COUNTRIES = col2)
dt
#>   PERSON_ID
#> 1         1
#> 2         2
#>                                                              COUNTRIES
#> 1 Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome
#> 2        Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti

dt$COUNTRIES2 <- strsplit(dt$COUNTRIES, ", ", fixed = TRUE) |>
  lapply(\(x) rle(x)$values) |>
  sapply(paste, collapse = ", ")

subset(dt, select = -COUNTRIES)
#>   PERSON_ID                               COUNTRIES2
#> 1         1 Eesti, Soome, Eesti, Soome, Eesti, Soome
#> 2         2       Ukraina, Eesti, Luksembourg, Eesti

创建于 2023-10-10 with reprex v2.0.2