Заполните новый столбец построчно, используя значения из разных существующих столбцов, используя дату в качестве критерия выбора - PullRequest
0 голосов
/ 21 мая 2018

Я использую R для редактирования CSV точек GPS.Таблица выглядит примерно так:

ID    DATE        2002.08.01    2002.08.02    2002.08.03    2002.08.04
1     8/1/2002    56            41            54            89
2     8/2/2002    65            59            69            10
3     8/2/2002    66            51            61            5
4     8/3/2002    11            21            12            32

Каждый столбец в таблице выше, у которого есть дата, поскольку заголовок столбца представляет собой глубину снега для одного конкретного дня в этой точке GPS.Мне нужен новый столбец SNOW_DEPTH, в котором только имеет глубину снега для правильной даты для этой точки GPS.В приведенных мной примере данных решение, которое я ищу, состоит в следующем:

ID    DATE        SNOW_DEPTH
1     8/1/2002    56
2     8/2/2002    59
3     8/2/2002    51
4     8/3/2002    12

Обратите внимание, что значения SNOW_DEPTH в таблице решений заполняются из значений глубины снега из этой строки но столбец, используемый для заполнения, зависит от даты.

Я не хочу перечислить каждый столбец по имени, так как в моих реальных данных есть тысячистолбцов (все с датами в качестве заголовков столбцов).Есть ли простое решение на основе сценариев R для моей дилеммы?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вот решение с использованием пакета tidyverse пакетов.Обратите внимание, что я предполагаю, что DATE хранится как символ или фактор.

df <- read_table("ID    DATE        2002.08.01    2002.08.02    2002.08.03    2002.08.04
1     8/1/2002    56            41            54            89
2     8/2/2002    65            59            69            10
3     8/2/2002    66            51            61            5
4     8/3/2002    11            21            12            32")

library(tidyverse)
df %>%
  gather(COL_DATE, SNOW_DEPTH, -ID, -DATE) %>%
  mutate( # this converts both `DATE` and `COL_DATE` to the date-time format.  If `DATE` is already in this format, skip the first conversion (you still need to convert `COL_DATE`).
    DATE = as.Date(DATE,format = "%m/%d/%Y"),
    COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
  ) %>%
  filter(DATE == COL_DATE) %>%
  select(-COL_DATE)
0 голосов
/ 21 мая 2018

Я думаю, что вам лучше всего создать «длинный» файл с ID/date/value, бегущим вниз по странице, а затем просто объединить его с исходными данными, совпадающими на ID и date:

merge(
  transform(dat[1:2], ind=format(as.Date(DATE, format="%m/%d/%Y"), "%Y.%m.%d")),
  cbind(dat["ID"], stack(dat[-(1:2)]))
)

#  ID        ind     DATE values
#1  1 2002.08.01 8/1/2002     56
#2  2 2002.08.02 8/2/2002     59
#3  3 2002.08.02 8/2/2002     51
#4  4 2002.08.03 8/3/2002     12

cbind(dat["ID"], stack(dat[-(1:2)])) дает длинный файл:

#   ID values        ind
#1   1     56 2002.08.01
#2   2     65 2002.08.01
#3   3     66 2002.08.01
# <snip>

И transform(dat[1:2], ind=format(as.Date(DATE, format="%m/%d/%Y"), "%Y.%m.%d")) возвращает правильно отформатированную дату для merge, затем:

#  ID     DATE        ind
#1  1 8/1/2002 2002.08.01
#2  2 8/2/2002 2002.08.02
#3  3 8/2/2002 2002.08.02
#4  4 8/3/2002 2002.08.03

Где dat дляэтот пример был:

dat <- read.table(text="ID    DATE        2002.08.01    2002.08.02    2002.08.03    2002.08.04
1     8/1/2002    56            41            54            89
2     8/2/2002    65            59            69            10
3     8/2/2002    66            51            61            5
4     8/3/2002    11            21            12            32", header=TRUE, stringsAsFactors=FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...