Объединение данных из 2 файлов по дате

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
sin2000
Новоприбывший
Сообщения: 4
Зарегистрирован: 29 июл 2015, 10:49
Репутация: 0

Объединение данных из 2 файлов по дате

Сообщение sin2000 » 29 июл 2015, 11:05

R version 3.2.1

Есть два файла с данными (А1.csv и А2.csv на диске D).
А1 - пятидневные (понедельник-пятница).
А2 - даты могут не совпадать с датами А1.

Нужно - обьеденение данных из 2 файлов по дате в один, точнее столбец Х из А2 вставить в А1.
По следующим условия:

1. Ищем дату - если есть, ставим Х в эту строку (фаил с примером A3).
2. Если нет - ставим Х на ближнюю, но на 1 шаг назад (фаил с примером A3).
3. Заполняем пустые строки предыдущими значениями Х (фаил с примером A4).
4. Удаляем строки с пустыми значениями столбца Х
5. Выгружаем полученое на диск D в Файл А5

Возможно ли в R такое сделать? Кому не сложно напишите код с коментами
(чтоб самому вникнуть была возможнось) или посоветуйте где можно
такое сделать простыми средствами. Спасибо.
Вложения
А1_А5.zip
(1.53 КБ) 200 скачиваний
А1_А5.jpg
А1_А5.jpg (106.98 КБ) 3936 просмотров

gamm
Гуру
Сообщения: 3274
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 828
Ваше звание: программист
Откуда: Казань

Re: Объединение данных из 2 файлов по дате

Сообщение gamm » 29 июл 2015, 12:35

домашние задания делаем сами. Прочитав help для функций merge() и match() :mrgreen:

sin2000
Новоприбывший
Сообщения: 4
Зарегистрирован: 29 июл 2015, 10:49
Репутация: 0

Re: Объединение данных из 2 файлов по дате

Сообщение sin2000 » 06 фев 2016, 13:48

Спасибо. С обьеденением через merge() разобрался.
А вот заменить NA предыдущими значениями не получается.
Помогите если несложно на примере.

A <- c(NA, 2, 3, NA, 5)
B <- c(10, NA, 30, 40, NA)
C <- c(100, NA, NA, NA, 500)
x <- data.frame(A, B, C) #создадим data.frame из векторов A, B, C.

Получилось следующее -

A B C
1 NA 10 100
2 2 NA NA
3 3 30 NA
4 NA 40 NA
5 5 NA 500

Нужно заменить NA предыдущими значениями, чтобы получилось вот так -

A B C
1 NA 10 100
2 2 10 100
3 3 30 100
4 3 40 100
5 5 40 500

Так как для первой строки столбца А нет предыдущего значения,
то остается NA, потом или вырежу строку или заменю нулем.
x[is.na(x)] <- 0

Иван Стрельников
Интересующийся
Сообщения: 40
Зарегистрирован: 11 авг 2011, 13:23
Репутация: 15

Re: Объединение данных из 2 файлов по дате

Сообщение Иван Стрельников » 08 фев 2016, 10:05

Можно так:

Код: Выделить всё

A <- c(NA, 2, 3, NA, 5)
B <- c(10, NA, 30, 40, NA)
C <- c(100, NA, NA, NA, 500)
X <- data.frame(A, B, C) #создадим data.frame из векторов A, B, C.

options(warn=-1) # Временно отключаем предупреждения
X_rep<-apply(X, 2, function(x){
		while (max(which(is.na(x)))>1){ # Цикл для случая нескольких NA подряд
			Mask<-which(is.na(x))	# Индексы NA значений
			Mask<-Mask - 1	# Смещаем индексы на 1
			Mask[Mask<1]<-NA	# Случай, когда предыдущих значений нет
			x[is.na(x)]<-x[Mask]
		}
		return(x)
	})
options(warn=0)

> X_rep
      A  B   C
[1,] NA 10 100
[2,]  2 10 100
[3,]  3 30 100
[4,]  3 40 100
[5,]  5 40 500

gamm
Гуру
Сообщения: 3274
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 828
Ваше звание: программист
Откуда: Казань

Re: Объединение данных из 2 файлов по дате

Сообщение gamm » 08 фев 2016, 12:26

не портите педагогический процесс, у пионэра, похоже, сессия :-)

и вообще, это не так делается, а за один проход - идем вдоль вектора, всегда запоминаем последнее не NA, и заменяем на него все NA, которые встречаются. Сделать это можно либо циклом, либо итератором, в последнем случае нужен доступ на запись к внешним переменным (из глобального environment). Пионэр должен изучить разные for, apply, tapplay, sapplay и assign, environment

но программу пусть напишет сам.

sin2000
Новоприбывший
Сообщения: 4
Зарегистрирован: 29 июл 2015, 10:49
Репутация: 0

Re: Объединение данных из 2 файлов по дате

Сообщение sin2000 » 08 фев 2016, 13:25

Иван Стрельников
Большое спасибо, работает. Вот только если NA в столбце А не только
в первой, а к примеру еще и во второй строке, то R виснет намертво.

gamm
Не пионер, а старый маразматик. Простите за беспокойство.

gamm
Гуру
Сообщения: 3274
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 828
Ваше звание: программист
Откуда: Казань

Re: Объединение данных из 2 файлов по дате

Сообщение gamm » 08 фев 2016, 14:08

sin2000 писал(а):Не пионер, а старый маразматик. Простите за беспокойство.
звиняйте, дядько :D
держите:

Код: Выделить всё

x<-c(NA,1,2,NA,NA,NA,1,NA)
old.val<-NA
for(i in 1:length(x)) {
  if(is.na(x[i])) {
    x[i]<-old.val
  } else {
    old.val<-x[i]
  }
}
x
# [1] NA  1  2  2  2  2  1  1
если в векторе не сотни тысяч элементов, то работает нормально.

sin2000
Новоприбывший
Сообщения: 4
Зарегистрирован: 29 июл 2015, 10:49
Репутация: 0

Re: Объединение данных из 2 файлов по дате

Сообщение sin2000 » 09 фев 2016, 10:11

gamm
Большое спасибо, работает отлично.

gamm
Гуру
Сообщения: 3274
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 828
Ваше звание: программист
Откуда: Казань

Re: Объединение данных из 2 файлов по дате

Сообщение gamm » 09 фев 2016, 13:39

sin2000 писал(а):Большое спасибо, работает отлично.
обращайтесь :D

oda412
Новоприбывший
Сообщения: 13
Зарегистрирован: 01 июл 2020, 11:43
Репутация: 0
Откуда: Брёхово

Re: Объединение данных из 2 файлов по дате

Сообщение oda412 » 17 ноя 2020, 22:19

Здравствуйте!
У меня похожая задача, но в моем случае даты в двух таблицах могут не совпадать вовсе, а даты итоговой таблицы должны включать в себя все даты первой и второй таблиц.
Научите, пожалуйста, как из таблиц А1 и А2 получить таблицу А3:

Изображение
Вложения
A1-A3.zip
(645 байт) 8 скачиваний

nplatonov
Интересующийся
Сообщения: 24
Зарегистрирован: 07 фев 2012, 12:00
Репутация: 20

Re: Объединение данных из 2 файлов по дате

Сообщение nplatonov » 18 ноя 2020, 07:45

Код: Выделить всё

A1 <- read.delim("A1.txt",sep="\t")
A2 <- read.delim("A2.txt",sep="\t")
A3 <- data.frame(t=sort(unique(c(A1$t,A2$t))),a1=NA,a2=NA)
A3$a1[match(A1$t,A3$t)] <- A1$a1
A3$a2[match(A2$t,A3$t)] <- A2$a2
A3

oda412
Новоприбывший
Сообщения: 13
Зарегистрирован: 01 июл 2020, 11:43
Репутация: 0
Откуда: Брёхово

Re: Объединение данных из 2 файлов по дате

Сообщение oda412 » 18 ноя 2020, 11:09

nplatonov, здравствуйте! Спасибо большое за элегантное решение - работает!
Даты у меня считались криво - немного дополнила код:

Код: Выделить всё

A1 <- read.delim("A1.txt",sep="\t")
A2 <- read.delim("A2.txt",sep="\t")

A1$t<-parse_date_time(as.character(A1$t),"dmy HMS") # пакет lubridate
A2$t<-parse_date_time(as.character(A2$t),"dmy HMS") # пакет lubridate

A3 <- data.frame(t=sort(unique(c(A1$t,A2$t))),a1=NA,a2=NA)
A3$a1[match(A1$t,A3$t)] <- A1$a1
A3$a2[match(A2$t,A3$t)] <- A2$a2
A3

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость