将特定列转换为数据框的行,并保留所有其他列。

13

我试图获取一个包含每种gridNumber类型的元素的具体值的列,并dcast它,以便从元素列创建3个独立的列。 我不确定如何做到这一点。

dput:

df <- structure(list(date = structure(c(-25584, -25584, -25584, -25583, 
-25583, -25583, -25582, -25582, -25582, -25581), class = "Date"), 
    year = c(1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 
    1899, 1899), month = c(12, 12, 12, 12, 12, 12, 12, 12, 12, 
    12), day = c(15, 15, 15, 16, 16, 16, 17, 17, 17, 18), gridNumber = c(526228, 
    526228, 526228, 526228, 526228, 526228, 526229, 526229, 526229, 
    526229), element = c("PPT", "TMAX", "TMIN", "PPT", "TMAX", 
    "TMIN", "PPT", "TMAX", "TMIN", "PPT"), value = c(0, 43.4782, 
    21.7403, 0, 43.3297, 20.751, 0, 57.3625, 25.8157, 0.2105)), .Names = c("date", 
"year", "month", "day", "gridNumber", "element", "value"), row.names = c(NA, 
10L), class = "data.frame")

数据框:

         date year month day gridNumber element   value
1  1899-12-15 1899    12  15     526228     PPT  0.0000
2  1899-12-15 1899    12  15     526228    TMAX 43.4782
3  1899-12-15 1899    12  15     526228    TMIN 21.7403
4  1899-12-16 1899    12  16     526228     PPT  0.0000
5  1899-12-16 1899    12  16     526228    TMAX 43.3297
6  1899-12-16 1899    12  16     526228    TMIN 20.7510
7  1899-12-17 1899    12  17     526229     PPT  0.0000
8  1899-12-17 1899    12  17     526229    TMAX 57.3625
9  1899-12-17 1899    12  17     526229    TMIN 25.8157
10 1899-12-18 1899    12  18     526229     PPT  0.2105

dcast尝试:

newdat <- dcast(df, date ~ element)

期望的输出列:

date year month day gridNumber PPT TMAX TMIN value
2个回答

19

我们可以使用dcast函数。在~的左侧的...包括所有未在右侧和value.var中指定的变量。

library(reshape2)
dcast(df, ...~element, value.var='value')
#        date year month day gridNumber    PPT    TMAX    TMIN
#1 1899-12-15 1899    12  15     526228 0.0000 43.4782 21.7403
#2 1899-12-16 1899    12  16     526228 0.0000 43.3297 20.7510
#3 1899-12-17 1899    12  17     526229 0.0000 57.3625 25.8157
#4 1899-12-18 1899    12  18     526229 0.2105      NA      NA

1
这也可以运行;谢谢!我以为我可以用dcast做到,现在知道了... - Vedda
@tino_ladino。你的意思是将...~ element替换为....,但我们如何确定因变量/自变量? - akrun

3
这可能不完全符合您的要求,因为您有一个独立的值列。那么,在PPT、TMAX和TMIN下面应该放什么?
以下是如何使用 dplyrtidyr 将值放入适当的列中:
library(dplyr)
library(tidyr)
df1 %>%
spread(element,value)
        date year month day gridNumber    PPT    TMAX    TMIN
1 1899-12-15 1899    12  15     526228 0.0000 43.4782 21.7403
2 1899-12-16 1899    12  16     526228 0.0000 43.3297 20.7510
3 1899-12-17 1899    12  17     526229 0.0000 57.3625 25.8157
4 1899-12-18 1899    12  18     526229 0.2105      NA      NA

可以仅使用tidyr在一行中编写:
spread(df1,element,value)

这个完美运作。我不知道你可以在 tidyr 中做到这一点。谢谢! - Vedda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接