Как мне создать новый фрейм данных на основе таблицы, сгенерированной R? - PullRequest
3 голосов
/ 09 июля 2011

Я получаю CSV-файл с тысячами строк и несколькими столбцами.Пожалуйста, посмотрите в качестве примера того, как выглядит файл:

Subject     Duration    
A             1.3   
B             6.7   
C             3.2   
A             2.5   
D             2.7   
E             99    
F             8.4   
G             12.5  
H             19.7  
Z             3.2   
A             56    
B             9.4   
.              .    
.              .    
.              .    

Обратите внимание, что для одного и того же предмета продолжительность может отличаться.Я хочу добавить продолжительность для каждого конкретного предмета, например, я хочу знать общую продолжительность для предмета A, общую продолжительность для предмета B и т. Д. У меня так много названий предметов, что я не могу вручную ввести каждый предмет и спроситьза ответ.Я хочу выяснить сумму продолжительности для каждого предмета, а затем создать новый фрейм данных или новый файл, который будет иметь имя субъекта, соответствующее общей продолжительности.

Заранее большое спасибо !!!!!! * * 1006

Ответы [ 3 ]

5 голосов
/ 09 июля 2011

Вот базовая версия, которая может работать. Я позаимствовал пример у Карстена.

На самом деле я делю data.frame согласно subject. Это приводит к списку

split(d, d$subject)

$A
   subject duration
1        A      1.3
4        A      2.5
11       A     56.0

$B
   subject duration
2        B      6.7
12       B      9.4

$C
  subject duration
3       C      3.2

Используя lapply, я пролистываю каждый элемент списка и столбец суммы duration. Я добавил na.rm = TRUE, чтобы функция по-прежнему суммировала, даже если присутствуют NA.

Я представляю это в одной строке

lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE))

$A
[1] 59.8

$B
[1] 16.1

$C
[1] 3.2

Вы можете unlist или поместить результат в data.frame, чтобы преобразовать список в нечто более компактное.

unlist(lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE)))
   A    B    C    D    E    F    G    H    Z 
59.8 16.1  3.2  2.7 99.0  8.4 12.5 19.7  3.2 
2 голосов
/ 09 июля 2011

Это задача, для которой * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * 100 * * * * * * * 100 * * *

* *1008* * *1008* * *1008* * Если я понимаю ваш вопрос, вы хотите добавить третью колонкускажем total_duration, который содержит сумму всех длительностей для каждого предмета.Для этого очень полезна функция merge.Обратите внимание, что я сохранил результат вычисления выше как новую переменную total_durations.Теперь, чтобы создать data.frame с тремя столбцами и записать его в файл, выполните

result <- merge(d,total_durations, by="subject")
write.csv(result, "file.csv", row.names=FALSE)

Что касается типов данных, в приведенном выше примере переменные d, total_durations иresult являются data.frame объектами.С другой стороны, f - это функция, которая описывает, что делать с наблюдениями для каждого субъекта.Другие разумные определения для f будут

f <- function(df) nrow(df) # counts the observations per subject
f <- function(df) mean(df$duration) # calculates the mean duration for each subject
1 голос
/ 09 июля 2011

Вы можете использовать пакет plyr

ddply(aa, "Subject", summarise, POSITION=sum("Duration"))

где переменная aa - это ваш data.frame

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