我需要在数据集中创建一列,报告选择中最新按行模态文本值 列(忽略 NA)。
背景:我有一个数据集,其中最多有 4 名编码员对参与者成绩单进行评分(一名参与者/行)。有时,少数编码员要么不同意,要么为参与者/行选择错误的代码。因此,我需要为每个参与者(即每一行)跨编码器重复选择模态代码响应,并且当出现平局时,选择最近(稍后)的模态代码响应(因为后面的编码更有可能是正确的) )。
这是一个虚假的数据集示例,其中包含 3 个参与者(一个/行)的 4 个编码器代码(论文或聊天)。
> fakeData = data.frame(id = 1:3,
+ Condition = c("Essay", "Chat", "Chat"),
+ FirstCoder = c("NA","Essay","Essay"),
+ SecondCoder = c("NA","Chat","Essay"),
+ ThirdCoder = c("Essay","Chat","Chat"),
+ FourthCoder = c("Essay","NA","Chat"))
> fakeData
id Condition FirstCoder SecondCoder ThirdCoder FourthCoder
1 1 Essay NA NA Essay Essay
2 2 Chat Essay Chat Chat NA
3 3 Chat Essay Essay Chat Chat
关于新近度:“FirstCoder”首先编码,“SecondCoder”接下来编码,然后“ThirdCoder”提交其代码,“FourthCoder”是最后一个(也是最近的)提交的编码器回应。
以下是我在其他论坛上尝试过的一些方法 - 请注意我需要如何忽略“条件”列:
> fakeData$ModalCode1 <- apply(fakeData,1,function(x) names(which.max(table(c("FirstCoder","SecondCoder", "ThirdCoder", "FourthCoder")))))
> fakeData$ModalCode2 <- apply(select(fakeData,ends_with("Coder")), 1, Mode)
正确的结果是此列(手动创建)
> fakeData$MostRecentModalCode <- c("Essay", "Chat", "Chat")
您可以看到我的所有尝试都没有得到正确的结果(即“MostRecentModalCode”)。
> fakeData
id Condition FirstCoder SecondCoder ThirdCoder FourthCoder ModalCode1 ModalCode2 MostRecentModalCode
1 1 Essay NA NA Essay Essay FirstCoder NA Essay
2 2 Chat Essay Chat Chat NA FirstCoder Chat Chat
3 3 Chat Essay Essay Chat Chat FirstCoder Essay Chat
正如您所看到的,最后(正确)列忽略了 NA,并打破了与最新编码员响应的模态联系(与传统的 Mode 函数不同)。
当然有一个函数可以实现这一点,但我只是未能找到或正确实现它。
欢迎提供建议和解决方案! (如果我必须创建一个自定义函数,那很好,尽管令人惊讶。)
最佳答案
我们可以使用here中的Mode
函数
> Mode <- function(x) {
+ ux <- unique(x)
+ ux[which.max(tabulate(match(x, ux)))]
+ }
>
> apply(fakeData[-1], 1, Mode)
[1] "Essay" "Chat" "Chat"
关于r - 特定列中最常见的因素 - 打破最近的联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75960077/