gpt4 book ai didi

用子集平均值替换向量值的子集

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

我有一个有点困惑的数据框,其中对主题进行了排名,但有些与排名相关。

    subj<-c("A","B","C,D,E","C,D,E","C,D,E","F","G,H","G,H","I")
rank<-c(1,2,3,4,5,6,7,8,9)
df<-data.frame(rank,subj)
df
rank subj
1 1 A
2 2 B
3 3 C,D,E
4 4 C,D,E
5 5 C,D,E
6 6 F
7 7 G,H
8 8 G,H
9 9 I

如果个人并列,我需要将他们的排名表示为并列位置的平均值。类似的东西

    n.rank n.subj
1 1.0 A
2 2.0 B
3 4.0 C
4 4.0 D
5 4.0 E
6 6.0 F
7 7.5 G
8 7.5 H
9 9.0 I

我尝试过使用 strngsplit() 并按等级命名列表元素,但最终得到的数据框似乎同样难以处理。

 a<-strsplit(as.character(df$subj),",")
names(a)<-df$rank
b<-melt(a)
colnames(b)<-c("n.subj","n.rank")
b[1:10,]
n.subj n.rank
1 A 1
2 B 2
3 C 3
4 D 3
5 E 3
6 C 4
7 D 4
8 E 4
9 C 5
10 D 5

当我使用 gregexpr()regmatches() 尝试识别需要平均的排名时,我也陷入了死胡同。

    m<-gregexpr(",+",df$subj)
df$no.avg<-melt(lapply(regmatches(df$subj, m),length))[,1]+1
df
rank subj no.avg
1 1 A 1
2 2 B 1
3 3 C,D,E 3
4 4 C,D,E 3
5 5 C,D,E 3
6 6 F 1
7 7 G,H 2
8 8 G,H 2
9 9 I 1

有什么创造性的解决方案吗?非常感谢。

最佳答案

这是我的尝试。我首先计算平均排名,然后将相同排名的受试者分成几行。

library(tidyverse)
options(stringsAsFactors = FALSE)
subj <- c("A", "B", "C,D,E", "C,D,E", "C,D,E", "F", "G,H", "G,H", "I")
rank <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
df <- data.frame(rank, subj)

df %>%
group_by(subj) %>%
summarise(rank = mean(rank)) %>%
rowwise() %>%
do(tibble(subj = unlist(strsplit(.$subj, ",")), rank = .$rank)) %>%
ungroup()

输出:

# A tibble: 9 × 2
subj rank
* <chr> <dbl>
1 A 1.0
2 B 2.0
3 C 4.0
4 D 4.0
5 E 4.0
6 F 6.0
7 G 7.5
8 H 7.5
9 I 9.0
<小时/>

另一种方法:

m <- aggregate(rank~subj, data=df, mean)
m <- apply(m, 1, function(x) data.frame(subj = unlist(strsplit(x[1], ",")), rank = x[2]))
m <- do.call(rbind, m)
rownames(m) <- NULL
m

输出:

subj rank
1 A 1.0
2 B 2.0
3 C 4.0
4 D 4.0
5 E 4.0
6 F 6.0
7 G 7.5
8 H 7.5
9 I 9.0

关于用子集平均值替换向量值的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217571/

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