我有一個有點凌亂的數據框,其中的主題排名,但有些與排名並列。將子集的矢量值替換爲子集的平均值
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
那裏有什麼創意解決方案嗎?非常感謝。
最終的
mean
,我沒有使用這個腳本因爲我不活在'tidyverse'中,但是按平均排列順序的邏輯首先解決了問題。非常感謝。 – gavago@gavago不客氣。我添加了另一種不需要'tidyverse'或'dplyr'的方法。 – kitman0804