2016-04-06 8 views
2

У меня есть следующие кадр данных, table5, состоящие из x и его частоты, произведенные из других данных, используя counts:Р: Создать матрицу значений из другой таблицы

x freq 
1 1 3 
2 3 21 
3 4 21 
4 5 1345 
5 7 1 

, который я хотел бы передать - в общем виде, т.е. для использования с другими значениями в первоначальном кадре данных - в следующем кадре данных table5if:

 Frequency 
3    21 
4    21 
5    1345 
other   4 

т.е. где частота чисел 3, 4 и 5 передается напрямую, и др Другие номера добавляются вместе в other. Моя последняя попытка заключается в следующем:

k <- seq(1, nrow(table5), by=1) 
    ifelse(table5$x[k] == 3, table5if[1] <- table5$freq[k], 
      ifelse(table5$x[k] == 4, table5if[2] <- table5$freq[k], 
       ifelse(table5$x[k] == 5, table5if[3] <- table5$freq[k], table5if[4] <- (table5if[4] + table5$freq[k]) 
       ) 
      ) 
    ) 

Эта попытка, и другие попытки использовать if(...){...} else {...} etc., имеют все дали некоторую форму предупреждения или ошибки (например, «количество элементов для замены ...» и «число измерений .. . »и не дали каких-либо убедительных результатов. Я просмотрел множество других вопросов для ошибок и предупреждений и не могу найти то, что я ищу, - есть много об векторизации, но я не могу получить голова вокруг, почему это будет проблемой. Может ли кто-нибудь предложить подходящий вариант для этой небольшой задачи?

+0

Почему бы просто не добавить все частоты, а затем вычесть их для чисел 3, 4 и 5, чтобы вычислить общее количество для других? –

+0

Это, безусловно, самый простой вариант! Я также являюсь поклонником избегания готовых функций и сохранения его математики и логики. Большое спасибо за ваше предложение, windrunn3r.1990! – Psydes

ответ

3

Я бы заполнил цифрой factor(x, levels = 3:5), пока все несуществующие уровни станут NA. n измените это после этого на "other", если хотите. data.table удобно в этом случае, как он держит в NA сек отдельную группу, а не опуская их

library(data.table) 
setDT(df)[, .(Frequency = sum(freq)), by = factor(x, levels = 3:5)] 
# factor Frequency 
# 1:  NA   4 
# 2:  3  21 
# 3:  4  21 
# 4:  5  1345 
+0

Это тоже великолепно! Большое спасибо, Дэвид Аренбург. – Psydes

0

A base R вариант должен был бы создать логический индекс, основанный на значениях столбца «х» с %in%. Мы получаем sum «freq» на основе отрицательного индекса «i1» и rbind с подмножествами строк «table5».

i1 <- table5$x %in% 3:5 
`row.names<-`(rbind(table5[i1,], list(x= "Other", 
      freq=sum(table5[!i1,"freq"]))), NULL) 
#  x freq 
#1  3 21 
#2  4 21 
#3  5 1345 
#4 Other 4 
+0

Это работало безупречно! Я тестировал его с помощью управляемых значений из таблицы5 и не имел проблем. +10 уличных кредитов для вас, акрун! Большое спасибо. – Psydes

+0

@Psydes Спасибо за отзыв. Вы забыли остановиться? – akrun