簡體   English   中英

R - 從具有不同列數的數據列表創建數據框

[英]R - Create dataframe from a list of data with different number of columns

我有一個數據集,在同一列表中顯示日期、位置名稱和值。 我的目標是在循環中生成一個數據框,其中列顯示每個日期的值,位置名稱是行。

但是,日期並不總是匹配。 缺失值可以是 NA。

此外,我只需要第二個值 (value2)。

什么是最簡單的方法來做到這一點?

樣本數據:

data <- structure(list(date = structure(c(7L, 4L, 6L, 15L, 3L, 1L, 13L, 2L, 16L, 11L, 7L, 14L, 8L, 4L, 6L, 15L, 3L, 9L, 10L, 1L, 12L, 5L, 7L, 14L, 8L, 4L, 6L, 15L, 9L, 10L, 1L, 13L, 2L, 16L, 11L), .Label = c("01.10.2013", "01.10.2015", "08.10.2010", "13.09.2007", "16.09.2003", "17.09.2008", "20.09.2004", "21.09.2006", "23.09.2011", "26.09.2012", "26.09.2017", "27.08.2001", "29.09.2014", "30.08.2005", "30.09.2009", "30.09.2016" ), class = "factor"), name = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("P1", "P2", "P3"), class = "factor"), value = c(14L, 453L, 345L, 765L, 87L, 45L, 4L, 12L, 2L, 6L, 84L, 11L, 87L, 45L, 4L, 12L, 12L, 14L, 453L, 345L, 51L, 50L, 123L, 34L, 75L, 74L, 42L, 2L, 123L, 42L, 12L, 6L, 9L, 4L, 1L), value2 = c(0.046, 0.003, 0.022, 0.016, -0.035, 0.032, 0.013, -0.001, 0.018, -0.006, 0.017, -0.001, 0.02, 0, 0.009, 0.191, 0.169, 0.191, 0.286, 0.324, 0.426, 0.35, 0.212, 0.107, 0.081, 0.034, 0.084, 0.092, 0.054, 0.019, 0.022, 0.017, 0.018, 0.002, 0.017)), .Names = c("date", "name", "value", "value2" ), class = "data.frame", row.names = c(NA, -35L))

到目前為止,我已經嘗試了在互聯網上找到的不同的東西,但沒有一個對我有用。

首先,我生成了一個數據框,其中包含在列表中找到的所有唯一日期

data$date <- as.Date(data$date, format="%d.%m.%Y")
uniquedates <- as.data.frame(unique(sort(data$date)))
colnames(uniquedates) <- c("date")

接下來,我按名稱拆分數據。

split <- split(data, data$name)

最后,我嘗試從每個拆分中獲取 date 和 value2 並將它們合並到一個循環中。

for (i in seq_along(split)) {
  point <- split[[i]][,c("date","value2")]
  name <- as.character(unique(split[[i]]$name))
  colnames(merge)[colnames(merge) == "value2"] <- name
  merge <- merge(x=uniquedates, y = point, by='date', all.x = TRUE)
}

這是我正在尋找的結果:

date        P1      P2      P3
27.08.2001  NA      0.426   NA
16.09.2003  NA      NA      0.35
20.09.2004  0.046   0.017   0.212
30.08.2005  NA     -0.001   0.107
21.09.2006  NA      0.02    0.081
13.09.2007  0.003   0       0.034
17.09.2008  0.022   0.009   0.084
30.09.2009  0.016   0.191   0.092
08.10.2010  -0.035  0.169   NA
23.09.2011  NA      0.191   0.054
26.09.2012  NA      0.286   0.019
01.10.2013  0.032   0.324   0.022
29.09.2014  0.013   NA      0.017
01.10.2015  -0.001  NA      0.018
30.09.2016  0.018   NA      0.002
26.09.2017  -0.006  NA      0.017

查看 reshape2 包以及dcastmelt方法。

library(dplyr)
library(reshape2)

data2 = data%>%
  mutate(date = as.Date(date,format = '%d.%m.%Y'))%>% #Convert date to a date time object
  select(-value)%>% #Remove value because we dont need it
  dcast(date~name,value.var = "value2") # Pivot the dataframe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM