2015-12-18 2 views
2

Данный кадр данных с индексом и данных столбцов следующим образом:Вычислить среднее из строк при сопоставлении отдельных dataframe

AIndex <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) 
AData <- c(3,5,6,7,3,2,1,2,3,4,5,6,7,8,9) 
DF <- data.frame(AIndex,AData) 

И дали второй фрейм данных с некоторым перекрытием в индексе как так:

BIndex <- c(1,4,8,11,13) 
BData <- c(3,5,7,6,5) 
DF2 <- data.frame(BIndex,BData) 

Моя цель - найти, где индекс в A и индекс в B совпадают в кадре данных A, а затем вычислить среднее значение этой строки в A + 2 строках.

Например, в первый раз, когда A и B совпадают в A, это строка # 1. Поэтому я хотел бы найти соответствующую точку данных в A (3) и следующих двух точках данных (5 и 6). Таким образом, среднее значение будет 4,6

Окончательный результат будет новый кадр данных, который выглядел так:

Index Data 
1  4.6 
4  4 
8  3 
11  6 
13  8 

ответ

2

Есть несколько способов сделать это. Первый шаг, как правило, включает в себя поиск, где элементы совпадают:

mats = match(DF2$BIndex, DF$AIndex) 

Чтобы найти средства, просто сложить соответствующие значения

(AData[mats] + AData[mats+1] + AData[mats+2])/3 
2

Я новичок в R и этого сообщества. Я стараюсь следовать шагу @ csgillespie. результат будет таким:

> DF2 <- data.frame(BIndex, BData) 
> newInd <- merge(dat, DF2, by.x="AIndex", by.y="BIndex", all.y=T) 
> newInd$newCM <- (AData[mats] + AData[mats+1] + AData[mats+2])/3 
> newInd 

    AIndex AData BData newCM 
1  1  3  3 4.666667 
2  4  7  5 4.000000 
3  8  2  7 3.000000 
4  11  5  6 6.000000 
5  13  7  5 8.000000 

Спасибо!

+0

Добро пожаловать на переполнение стека! Это может решить проблему, но, пожалуйста, также дайте объяснение. Многие новые пользователи приходят к SO, а объяснение с помощью кода помогает им узнать, как адаптировать код для решения своей проблемы. В этом случае, например, вы можете сказать, что важная команда - «merge» для идентификации соответствующих записей. – JenB

+0

Благодарю вас за ваше предложение. @JenB Мои навыки в английском языке просто честны, но позвольте мне попробовать. Merge, как собственное имя, используется для объединения двух файлов данных, dat и DF2, с помощью идентификационного ключа, AIndex в dat (или x в атрибуте) и AIndex в DF2 (или y of.y). all.y = T указывает тип слияния, кажется правильным в MySql, включает все строки в DF2 $ BIndex (или y), но некоторые строки в $ AIndex. –

2

Вы можете сделать это с помощью data.table пакет:

library(data.table) 

setDT(DF2)[,mean(DF[BIndex:(BIndex+2),'AData']),BIndex] 
# BIndex  V1 
#1:  1 4.666667 
#2:  4 4.000000 
#3:  8 3.000000 
#4:  11 6.000000 
#5:  13 8.000000 
Смежные вопросы