【发布时间】:2017-07-02 05:40:20
【问题描述】:
我有一个有些凌乱的数据框,其中有一些科目排名,但有些排名并列。
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
有什么创造性的解决方案吗?非常感谢。
【问题讨论】: