我使用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,只有才有正确日期的雪深度。在我给出的示例数据中,我要寻找的解决方案如下:
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解决方案来解决我的困境吗?
发布于 2018-05-21 00:03:46
这里有一个使用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)发布于 2018-05-21 00:02:19
我认为您的最佳选择是在页面上使用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 12cbind(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)https://stackoverflow.com/questions/50440372
复制相似问题