如何在R中的lapply函数中使用当前列名?

zc0qhyus  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(119)

我有两个数据集:第一个数据集包含参与者对问题的数字答案:

data <- data.frame(Q1 = 1:5,
                   Q2 = rev(1:5),
                   Q3 = c(4, 5, 1, 2, 3))

第二个数据集用作存储解决方案的参考表:

ref.table <- data.frame(Question = c("Q1", "Q2", "Q3"),
                        Solution = c("big", "big", "small"))

我想比较这两个数据集,并创建一个新的数据集,其中包含关于答案是正确(1)还是不正确(0)的二进制信息。为此,答案1, 2, 3对应于"small",答案4, 5对应于"big"
我的尝试如下:

accuracy <- data.frame(lapply(data, function(x) {ifelse(x >= 4 & ref.table$Solution[ref.table$Question == colnames(data)[x]] == "big", 1, 0)}))

但不知何故,这只给了我不正确的答案为0,而正确的答案是NA。
有人知道怎么解决这个问题吗?谢谢!

pw9qyyiw

pw9qyyiw1#

使用tidyverse,循环across列,match列名(cur_column()),其中'Question'列来自'ref. table',获取相应的'Solution'值,检查它是否为'big'沿着列>=的值4并将逻辑强制为二进制

library(dplyr)
data %>%
   mutate(across(everything(), ~ +(.x >=4 & 
    ref.table$Solution[match(cur_column(), ref.table$Question)] == 
        "big")))
  • 输出
Q1 Q2 Q3
1  0  1  0
2  0  1  0
3  0  0  0
4  1  0  0
5  1  0  0

或者在base R中,循环lapply中的列名,用[[提取列,match应用的逻辑与上面相同

data[] <- lapply(names(data), \(nm) +(data[[nm]] >=4 & 
    ref.table$Solution[match(nm, ref.table$Question)] == "big"))

相关问题