提问人:Vida Beach 提问时间:10/10/2023 最后编辑:r2evansVida Beach 更新时间:10/11/2023 访问量:65
字符串拆分
String spliting
问:
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
我尝试过多种方法。
答:
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 列的每个元素。,
rle
rle
$value
sapply
评论
3赞
r2evans
10/11/2023
代码高尔夫,paste(..., collapse = ", ")
--> toString(...)
0赞
margusl
10/11/2023
#2
我们可以先用 拆分输入列中的字符串,这将生成一个拆分列表;应用于列表中的每个项目 through 生成一个运行长度编码对象列表,从中我们只保留向量;作为最后一步,我们将把列表中的所有这些向量折叠在一起,现在得到一个向量而不是列表。strsplit()
rle()
lapply()
values
sapply()
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
评论
dput(<your data frame>)
dput(head(<your data frame>))