首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自不同现有列的值逐行填充新列,使用日期作为选择标准。

使用来自不同现有列的值逐行填充新列,使用日期作为选择标准。
EN

Stack Overflow用户
提问于 2018-05-20 23:44:54
回答 2查看 310关注 0票数 3

我使用R来编辑GPS点的csv。桌子看起来有点像这样:

代码语言:javascript
复制
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只有才有正确日期的雪深度。在我给出的示例数据中,我要寻找的解决方案如下:

代码语言:javascript
复制
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解决方案来解决我的困境吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 00:03:46

这里有一个使用tidyverse包套件的解决方案。注意,我假设DATE是作为字符或因素存储的。

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2018-05-21 00:02:19

我认为您的最佳选择是在页面上使用ID/date/value创建一个“长”文件,然后将其合并到IDdate上的初始数据匹配中。

代码语言:javascript
复制
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)]))给出了长文件:

代码语言:javascript
复制
#   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

代码语言:javascript
复制
#  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是:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50440372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档