Присвойте количественные переменные точкам данных во фреймах данных в R - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь присвоить номера 1, 2 и 3 фрейму данных с 80 переменными и 250 наблюдениями (финансовые временные ряды). Другими словами, я хочу сгруппировать каждую точку данных в 1, 2 и 3 на основе критериев:

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

Например, используя этот фрейм данных, который построен аналогично моему. Обратите внимание, что значения в векторах могут меняться. Думайте о значениях в dat1 как о баллах от 1 до 5.

dat1 = data.frame(
  a = c(2.1,2.3,2.3), 
  b = c(3.6,3.7,3.8), 
  c = c(1.2,1.3,1.4),
  d = c(2.4, 2.3, 3.2), 
  e = c(3.9, 1.2, 3.1))

    a   b   c   d   e
1 2.1 3.6 1.2 2.4 3.9
2 2.3 3.7 1.3 2.3 1.2
3 2.3 3.8 1.4 3.2 3.1
  • Если значение составляет от 1 до 2 в dat1, присвойте значение 1.
  • Если значение составляет от 2 до 3 в dat1, присвойте значение 2.
  • Если значение больше 3 в dat1, присвойте значение 3.

Которым я хочу, чтобы конечный результат стал:

dat2=
  a b c d e
1 2 3 1 2 3
2 2 3 1 2 1
3 3 3 1 3 3

и затем суммируйте строки из dat1, если точки данных из dat2 имеют одинаковые значения для создания:

dat3=
   X1  X2  X3
1 1.2 4.5 7.5
2 2.5 4.6 3.7
3 1.4 0.0 13.4

Есть ли способ достичь этого? Я надеюсь, что это было понятно.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Используйте case_when () из dplyr внутри mutate в каждом столбце

0 голосов
/ 13 мая 2018

Используя floor, чтобы получить идентификатор группы, мы используем apply

d1=floor(dat1)
d1[d1>3]=3
d1
  a b c d e
1 2 3 1 2 3
2 2 3 1 2 1
3 3 3 1 3 3

xx=cbind(d1,dat1)

bl <- apply(xx,1, function(x){
    aggregate(x[6:10], by=list(Category=x[1:5]), FUN=sum)
})

df=Reduce(function(x, y) merge(x, y, by="Category",all=T), bl)
df$Category=NULL
 t(df)
   [,1] [,2] [,3]
x.x  1.2  4.5  7.5
x.y  2.5  4.6  3.7
x    1.4   NA 13.4
0 голосов
/ 13 мая 2018

Ваши условия в основном выполняются floor на dat1.Если вы хотите сделать это по очереди, я бы сначала конвертировал в длинный формат, а затем обратно в широкий.Вот пример использования data.table

library(data.table)

# convert to data.table and save row id
setDT(dat1)[, id := .I]

# convert to long and the back to wide using the row id and `floor` 
dcast(melt(dat1, id = "id"), # convert to long
      id ~ ifelse(value > 3, 3, floor(value)), # convert back to wide while aggregating
      sum) # calculating sum by group
#    id   1   2    3
# 1:  1 1.2 4.5  7.5
# 2:  2 2.5 4.6  3.7
# 3:  3 1.4 0.0 13.4
...