R Сгруппированный фрейм данных: функция связывает одно значение с другими значениями группы - PullRequest
0 голосов
/ 23 июня 2018

в сгруппированном фрейме данных я хотел бы применить функцию, которая связывает одно значение в фактической строке со всеми другими значениями группы (и того же столбца), за исключением одного в текущей строке.Это приведет к единственному значению новой переменной.Поэтому, если группа состоит из c (1,2,3,4,5), я хотел бы иметь новую переменную с: c (fun (1, c (2,3), fun (2, c (1,3)), fun (3, c (1,2)) Мои группы не имеют одинакового размера. Но стараясь так долго, я всегда получаю смешные значения, такие как нули или ошибки.

Пример кода:

  set.seed(3)  
dat <- data_frame(a=1:10,value=round(runif(10),2),group=c(1,1,1,2,2,3,3,3,3,4))

 # one possible function
dif.dist <- function(x1, x2) sum(abs(x1 - x2))/(length(x2)-1) 

 # with this, sometimes the grouping gets lost in "vec" and i receive zeros   
 x <- dat%>%
 group_by(group)%>%
 mutate(vec= list(value))%>%
 mutate(dif = dif.dist(unique(value),unlist(vec)[unlist(vec)!=value]))%>%
 ungroup()

 # another try with plyr, that returns only 0   
 dat <- ddply(dat, .(group), mutate, dif=dif.dist1(value[a==a],value[value!=value[a==a]]))

но функция работает

  dif.dist(dat$value[1],dat$value[2:3])
 [1] 0.85

Позже мне нужно это, чтобы получить матрицы расстояний большого набора переменных, связанных с каждым участником. Я был бы благодарен за помощь!

1 Ответ

0 голосов
/ 23 июня 2018

Одним из вариантов будет циклическая последовательность строк после группировки по 'group' и подмножество элементов 'value' на основе индекса

library(dplyr)
library(purrr)
out <- dat %>%
         group_by(group) %>% 
         mutate(dif = map_dbl(row_number(), ~ dif.dist(value[.x], value[-.x])))

head(out, 2)
# A tibble: 2 x 4
# Groups:   group [1]
#      a value group   dif
#  <int> <dbl> <dbl> <dbl>
#1     1  0.17     1  0.85
#2     2  0.81     1  1.07
...