如何使用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)
代码解释
group_by(sentence_start) %>% mutate(occurrence_count = n()):给每个句子开头添加一列,记录它在数据集中出现的总次数。ifelse(occurrence_count == 1, "1", "0"):如果出现次数是1,unique列设为"1",否则设为"0"。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" } }
关键修正点
- 用
table()统计所有句子开头的出现次数,这样第一次出现的重复值也能被正确计数。 - 循环遍历行索引
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
相关产品推荐
相关产品推荐

