r语言 - 使用不同现有列中的值逐行填充新列,使用日期作为选择标准



我正在使用R来编辑GPS点的csv。该表看起来像这样:

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 解决方案来解决我的困境?

这是使用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)

我认为你最好的选择是制作一个"长"文件,ID/date/value在页面上运行,然后将其合并回IDdate的初始数据匹配:

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)

最新更新