У меня есть несколько грязный фрейм данных, в котором предметы оцениваются, но некоторые из них привязаны к ранжированию.заменить подмножество векторных значений на среднее подмножество
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
Какие-либо творческие решения там? Большое спасибо.
В конце концов, я не использовал этот сценарий потому что я не живу в «tidyverse», но ваша логика усреднения ранга по предмету сначала сделала решение понятным. Большое спасибо. – gavago
@gavago Добро пожаловать. Я добавил другой подход, который не требует 'tidyverse' или' dplyr'. – kitman0804