Создание нового кадра данных на основе определенных условий - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть объект dataframe в R , образец которого выглядит следующим образом:

4   5   3
4   5   9
4   5   2
4   6   4
4   10  4
4   10  3
4   10  7
4   10  2
4   9   3
4   9   7
4   10  4
4   10  3
4   6   8
4   5   4
12  3   6
12  4   1
12  4   2
12  4   7

Из этого кадра данных я хочу создать новый кадр данных 20 столбцов, как показано ниже:

  1. Только одна строка в новом кадре данных для каждого уникального значения в $1.Следовательно, для этого примера данных новый информационный кадр должен иметь 2 строки (уникальные 4,12).

  2. $2 представляет номер столбца нового информационного кадра, в котором значение $3 (этого кадра данных) должен быть заполнен.Если есть повторяющиеся случаи, следует взять медиану значений $3.Например, для $1 значение 4 повторяется 5 раз, а в новом кадре данных столбец 5 первой строки должен иметь значение медиана (3,9,2,4) = 3.

  3. Все остальные значения столбца равны нулю.

Пример вывода для этих данных будет следующим:

0 0 0 0 3 4 0 0 3 4 0 0 0 0 0 0 0 0 0 0
0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Как мы можем сделать это в R?Огромное спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018
df = transform(df,V1=factor(V1))
fill = matrix(0,length(levels(df$V1)),20)
df2=aggregate(V3~.,df,function(x)floor(median(x)))
fill[cbind(as.integer(df2$V1),df2$V2)]=df2$V3
fill
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,]    0    0    0    0    3    6    0    0    5     3     0     0     0     0
[2,]    0    0    6    2    0    0    0    0    0     0     0     0     0     0
     [,15] [,16] [,17] [,18] [,19] [,20]
[1,]     0     0     0     0     0     0
[2,]     0     0     0     0     0     0
0 голосов
/ 21 ноября 2018

Вы уверены, что ожидаемый результат правильный?Я думаю, что есть ошибка в вычислении медианы в вашем вопросе, как также указано в комментариях.Вы можете сделать это следующим образом:

library(dplyr)

df$V1 <- as.numeric(as.factor(df$V1))
values <- df %>% group_by(V1,V2) %>% summarise(median=median(V3))
new_df <- matrix(0,nrow=length(unique(df$V1)), ncol=20)

for(i in 1:nrow(new_df)){
  for(j in 1:ncol(new_df)){
    value <- values$median[values$V1==i & values$V2==j]
    if(length(value)>0){
      new_df[i,j] = value  
    }
  }
}

new_df

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    0    0    0    0  3.5    6    0    0    5   3.5     0     0     0     0     0     0     0     0     0     0
[2,]    0    0    6    2  0.0    0    0    0    0   0.0     0     0     0     0     0     0     0     0     0     0

Результат немного отличается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...