我在数据框中有一列,每个单元格中有多个单词,用";"分隔(第二栏).

my_dataframe <- data.frame( first_column = c("x", "y", "x", "x", "y"),
                            second_column = c("important; very important; not important",
                                              "not important; important; very important",
                                              "very important; important",
                                              "important; not important",
                                              "not important"))
> my_dataframe
  first_column                            second_column
1            x important; very important; not important
2            y not important; important; very important
3            x                very important; important
4            x                 important; not important
5            y                            not important

我想每个单元格保留一个单词:最重要的一个.

所以我按优先顺序列了一个单词列表:

reference_importance <- list("very important", "important", "not important")

我想在第二栏中看到:

 second_column
1 very important
2 very important
3 very important
4 important
5 not important

我试过了

for (i in 1:dim(my_dataframe)[1]) {
  for (j in 1:length(reference_importance)) {
    if (j %in% my_dataframe$second_column){
      my_dataframe$second_column[i] <- paste(j)
      break}
  }
}

Then I thought the problem was that it didn't consider the different words separated by ";" so 我试过了 this:

for (i in 1:dim(my_dataframe)[1]) {
  value_as_list <- strsplit(my_dataframe$second_column[i], ";")
  print(value_as_list)
  for (j in reference_importance) {
    if (j %in% value_as_list){
      my_dataframe$second_column[i] == j
      break}
  }
} 

但这些并没有改变我专栏中的任何内容...

(我做这个例子是为了简化,但实际上我有一个巨大的表格,里面有更多的单词和可能性.这就是为什么我try 使用循环来完成它,而不是手动分配可能的答案.)

推荐答案

基本上使用strsplitmatch.

my_dataframe <- transform(my_dataframe, z=strsplit(second_column, '; ') |>
                            lapply(match, reference_importance) |>
                            sapply(min) |>
                            {\(x) unlist(reference_importance)[x]}())
my_dataframe
#   first_column                            second_column              z
# 1            x important; very important; not important very important
# 2            y not important; important; very important very important
# 3            x                very important; important very important
# 4            x                 important; not important      important
# 5            y                            not important  not important

Note: R>;=4.1已使用.

如果你需要一个循环,你可以这样做

spl <- strsplit(my_dataframe$second_column, '; ')
my_dataframe$z <- NA_character_

for (i in seq_along(spl)) {
  my_dataframe$z[i] <- reference_importance[[min(match(spl[[i]], reference_importance))]]
}
my_dataframe
#   first_column                            second_column              z
# 1            x important; very important; not important very important
# 2            y not important; important; very important very important
# 3            x                very important; important very important
# 4            x                 important; not important      important
# 5            y                            not important  not important

当然我用z来演示,实际上你会用second_column而不是z.

R相关问答推荐

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

将模拟变量乘以多个观测结果中的模拟变量

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

将复杂的组合列表转换为数据框架

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

用黄土法确定区间

在某些栏和某些条件下,替换dfs列表中的NA

使用整齐的计算(curl -curl )和杂音

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

`lazy_dt`不支持`dplyr/across`?

R中边际效应包中Logistic回归的交互作用风险比

将二进制数据库转换为频率表

使用`Watch()`和`renderUI()`时,不再满足仍出现在SHILINY AFTER条件中的条件输入

基于R中的间隔扩展数据集行

如何在PDF格式的kableExtra表格中显示管道字符?

使用R将简单的JSON解析为嵌套框架

减少雨云面之间的间距并绘制所有统计数据点

R-找出存在其他变量的各种大小的所有组合

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

按顺序将地块添加到列表