You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用if语句填充与目标值出现次数相关的两列?循环赋值结果被覆盖的问题解决

解决你的R循环赋值覆盖问题

我来帮你搞定这个问题!你遇到的核心问题是循环里每次都直接给整列赋值,而不是对应单独的行,所以最后一次循环的结果会覆盖掉之前所有行的数值,导致所有行的unique和duplication列都变成一样的。

问题根源分析

你的循环代码里,每次执行data_copy[,16] <- '0'或者data_copy[,16] <- '1'时,都是把第16列的所有行全部设置成同一个值,而不是只修改当前循环对应的那一行。不管前面循环处理了多少行,最后一次循环的操作都会把整列覆盖,所以最终所有行的结果都一样。

另外还有个小问题:你用duplicated(data_copy$sentence_start)得到的只是第二次及以后出现的重复值,第一次出现的重复值并没有被包含进去,这会导致判断逻辑不准确。

推荐解法:用dplyr向量式操作(高效又简洁)

既然你已经在使用dplyr,那直接用它的分组统计功能就能完美解决,完全不需要写循环,代码更易读且高效:

library(dplyr)

# 统计每个sentence_start的出现次数,然后赋值
data_copy <- data_copy %>%
  # 按句子开头分组,统计每组的行数(即出现次数)
  group_by(sentence_start) %>%
  mutate(occurrence_count = n()) %>%
  ungroup() %>%
  # 根据次数给目标列赋值
  mutate(
    unique = ifelse(occurrence_count == 1, "1", "0"),
    duplication = as.character(occurrence_count)
  ) %>%
  # 如果不需要临时的计数列,可以删掉
  select(-occurrence_count)

代码解释

  1. group_by(sentence_start) %>% mutate(occurrence_count = n()):给每个句子开头添加一列,记录它在数据集中出现的总次数。
  2. ifelse(occurrence_count == 1, "1", "0"):如果出现次数是1,unique列设为"1",否则设为"0"。
  3. as.character(occurrence_count):直接把出现次数转成字符型,赋值给duplication列。

如果一定要用循环:修正循环逻辑

如果你坚持要用循环实现,需要修改成遍历行索引,并且准确统计每个句子开头的出现次数:

# 先统计每个sentence_start的出现次数,避免漏判第一次出现的重复值
occurrence_counts <- table(data_copy$sentence_start)

# 遍历每一行的索引,而不是遍历sentence_start的值
for(i in 1:nrow(data_copy)){
  current_sentence <- data_copy$sentence_start[i]
  current_count <- occurrence_counts[current_sentence]
  
  if(current_count == 2){
    data_copy$unique[i] <- "0"
    data_copy$duplication[i] <- "2"
  } else if(current_count == 1){
    data_copy$unique[i] <- "1"
    data_copy$duplication[i] <- "1"
  }
}

关键修正点

  1. 用table()统计所有句子开头的出现次数,这样第一次出现的重复值也能被正确计数。
  2. 循环遍历行索引i,修改的是data_copy$unique[i]和data_copy$duplication[i]——也就是第i行的对应列,而不是整列。

测试你的示例数据

用你提供的示例数据测试dplyr方法,结果会符合预期:

dt <- structure(list(cong_cond = c("congruent", "congruent", "congruent", "congruent", "congruent"), sentence_start = c("Wojciech zranil sie mocno i spedzil noc w szpitalu pod", "Nie chce isc do pracy, zeby wypelnic papierkowa robote, ale", "Zacmienie Slonca nastepuje, gdy slonce i ksiezyc tworza", "Laura lubi tworzyc rekodziela i dlatego zapisala sie na", "Altówka ma podobna budowe do skrzypiec, ale ma cieplejszy"), presentation_mode = c("spoken", "spoken", "spoken", "spoken", "spoken"), unique = c("0", "0", "0", "0", "0"), duplication = c("2", "2", "2", "2", "2")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))

# 应用dplyr方法
dt <- dt %>%
  group_by(sentence_start) %>%
  mutate(count = n()) %>%
  ungroup() %>%
  mutate(
    unique = ifelse(count == 1, "1", "0"),
    duplication = as.character(count)
  ) %>%
  select(-count)

# 查看结果
print(dt)

运行后所有行的unique列都会变成"1",duplication列变成"1",因为每个句子开头都只出现了一次,完全符合预期。

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:22:31