2013-08-01 3 views
1

Другой вопрос о синтаксисе списка (я медленно изучаю, я думаю). У меня есть данные в следующем виде: упрощенногоПрименение hist к списку dataframes, содержащему NA

a=c(1,2,3,4,5,NA,NA) 
b=c(6,7,8,9,10,NA,NA) 
c=c(6,5,3,NA,NA,NA,NA) 
d=c(NA,NA,NA,NA,NA,NA,NA) 
A=data.frame(a,b,c,d) 
B=data.frame(c,b,a,d) 
C=data.frame(d,c,b,a) 
mylist=list(A,B,C) 
bins=c(0,2,4,6,8,10) 

Я хотел бы бен каждый столбец в списке dataframes в соответствии с определенными бункерами, а затем возвращаю среднее число для каждого бункера для каждого dataframe. Я не возражаю против того, какой формой является выход, кадр данных или список векторов. Таким образом, в этом примере:

hist(a,bins, plot= FALSE) 
hist(b,bins, plot= FALSE) 
hist(c,bins, plot= FALSE) 

дают отсчеты

$counts 
[1] 2 2 1 0 0 
$counts 
[1] 0 0 1 2 2 
$counts 
[1] 0 1 2 0 0 

соответственно.

я не знаю, как это сделать, но при условии, что d содержит только NA-х я хотел бы его вернуть:

$counts 
[1] 0 0 0 0 0 

(я думаю превратить каждый NA в 0).

Поэтому среднее значение А (который содержит а, б, в, г) будет:

$counts 
[1] 2 2 1 0 0 + 
$counts 
[1] 0 0 1 2 2 + 
$counts 
[1] 0 1 2 0 0 + 
$counts 
[1] 0 0 0 0 0 + 

= 2 3 4 2 2/4 

= 0.5 0.75 1 0.5 0.5 

Это будет мой желаемый выход для dataframe А. Окончательный список векторов будет также включать в себя соответствующие векторы для B и C, хотя, как я уже сказал, числовой кадр столбцов для каждого кадра данных в исходном списке также будет прекрасным, так как последний шаг будет состоять в том, чтобы я построил эти средние подсчеты против середины бункера.

Надеюсь, что моего объяснения достаточно, чтобы дать некоторое представление о том, что я пытаюсь сделать.

+0

Сделать 'd' цифровой:' d <- as.numeric (d) 'и он должен работать. – Thomas

+0

Привет, Томас, спасибо. В более простом случае, когда я хочу игнорировать столбцы в списке фреймов данных, которые содержат все NA (например, d), как я могу начать бинирование данных и получить среднее значение? – user1912925

ответ

2

Как я отметил в своем комментарии, делая d numeric решит простой случай, когда вы устраняете неполадки. Для того, чтобы получить средства, которые вы хотите, чтобы вычислить по всей dataframe, используйте apply, а затем принять некоторые rowMeans:

rowMeans(apply(A,2,function(a) hist(a,bins,plot=FALSE)$counts)) 
#[1] 0.50 0.75 1.00 0.50 0.50 

Чтобы сделать это для списка dataframes, только гнездо его в lapply (или sapply):

> lapply(mylist,function(X) 
     rowMeans(apply(X,2,function(a) hist(a,bins,plot=FALSE)$counts))) 
[[1]] 
[1] 0.50 0.75 1.00 0.50 0.50 

[[2]] 
[1] 0.50 0.75 1.00 0.50 0.50 

[[3]] 
[1] 0.50 0.75 1.00 0.50 0.50 

(Примечание: Видимо ваш ДФС все производят тот же результат, так что это похоже, что это не работает правильно, но это на самом деле.)

+0

+1 Хорошая работа, это похоже на то, что хочет OP –

+0

Привет, Thomas, спасибо за ответ, однако как я могу применить его к mylist (список, который содержит dataframes B и C, а также A)? – user1912925

+0

@ user1912925 см. Редактировать – Thomas

Смежные вопросы