gpt4 book ai didi

r - 使用 tidyverse 清理排名选择调查

转载 作者:行者123 更新时间:2023-12-04 01:04:18 25 4
gpt4 key购买 nike

我在 R 中有这样的调查数据,其中我向人们展示了两组 Action - 高和低 - 并要求他们对每个 Action 进行排名。每组包含独特的 Action ,用字母标记(总共 6 个 Action )。

 id   A_High   B_High   C_High   D_Low   E_Low    F_Low
001 5 2 1 6 4 3
002 6 4 3 5 2 1
003 3 1 6 2 4 5
004 6 5 2 1 3 4

我需要一个类似于下图的新 df,其中每个高操作都分配了一个新的数字等级(介于 0 和 3 之间),对应于排名低于的低操作项目的数量那个高 Action 。

例如,id 001 的人在 A_High 排名第 5,B_High 在 2,在 C_High 在 1。A_High 的新排名将为 1(因为只有 1 个 Low Action ,D_Low 排名低于 A_High), B_High 的新排名将为 3(因为所有 3 个 Low Action 的排名都低于 B_High),C_High 的新排名将为 3(因为所有 3 个 Low Action 的排名都低于 C_High).

 id   A_High_rank   B_High_rank   C_High_rank   
001 1 3 3
002 0 1 1
003 2 3 0
004 0 0 2

我觉得这可以通过 if/else 语句来完成,但怀疑应该有一种更有效的方法来使用 tidyverse 来实现这一点。在真实数据集中,我有 1000 多行和 12 个 Action (6 个高和 6 个低)。我将不胜感激。

谢谢!

数据:

"id   A_High   B_High   C_High   D_Low   E_Low    F_Low
001 5 2 1 6 4 3
002 6 4 3 5 2 1
003 3 1 6 2 4 5
004 6 5 2 1 3 4"

最佳答案

base R 选项将遍历“High”列,通过检查它是否小于“Low”来获取创建的逻辑矩阵的 rowSums列,并通过附加 _rank 作为后缀来重命名这些输出

out <- cbind(df1[1], sapply(df1[2:4],
function(x) rowSums(x < df1[endsWith(names(df1), 'Low')])))
names(out)[-1] <- paste0(names(out)[-1], "_rank")

-输出

out
# id A_High_rank B_High_rank C_High_rank
#1 1 1 3 3
#2 2 0 1 1
#3 3 2 3 0
#4 4 0 0 2

或者使用dplyr

library(dplyr)
df1 %>%
transmute(id, across(ends_with('High'),
~ rowSums(. < select(df1, ends_with('Low'))), .names = '{.col}_rank'))
# id A_High_rank B_High_rank C_High_rank
#1 1 1 3 3
#2 2 0 1 1
#3 3 2 3 0
#4 4 0 0 2

数据

df1 <- structure(list(id = 1:4, A_High = c(5L, 6L, 3L, 6L), B_High = c(2L, 
4L, 1L, 5L), C_High = c(1L, 3L, 6L, 2L), D_Low = c(6L, 5L, 2L,
1L), E_Low = c(4L, 2L, 4L, 3L), F_Low = c(3L, 1L, 5L, 4L)),
class = "data.frame", row.names = c(NA,
-4L))

关于r - 使用 tidyverse 清理排名选择调查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67007041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com