我有一个数据框,其中的两列如下:
datos.dates_ev
1 2010-2012;2012-2013;2014-2015
2 2010-2012;2012-2013;2014-2015
3 2006-2008;2010-2012;2014-2015
datos.ha_ev
1 3.96;10.08;3.60
2 7.83;12.24;3.06
3 3.87;4.23;0.81
我希望能够将每一列作为一个新表来处理,因此可以将第一个表用作第二个表的标题。
例如,我想访问属于“ 2010-2012”期间的所有“区域”并进行汇总。
我真正想做的是将两个字符列都分成新表,其中第一列包含第二列的标题。毕竟,我想按第一列(dates_ev)计算聚合。
下面,我介绍每一列的数据类型:
'data.frame': 29785 obs. of 13 variables:
$ OBJECTID : int 1093 1095 1105 1107 1111 1115 1118 1126 1130 1142 ...
$ id_group : int 216 281 434 457 495 572 577 620 646 831 ...
$ n_events : int 3 3 3 3 3 3 3 3 3 3 ...
$ ini_date : Factor w/ 11 levels "","2000-2002",..: 7 7 5 4 4 4 4 2 3 3 ...
$ end_date : Factor w/ 11 levels "","2002-2004",..: 9 9 9 6 6 5 8 5 5 8 ...
$ ini_ha : num 3.96 7.83 3.87 8.19 6.12 0.27 2.52 0.72 1.08 2.16 ...
$ end_ha : num 17.64 23.13 8.91 23.94 10.08 ...
$ n_fids : int 8 13 8 9 9 5 8 4 4 18 ...
$ fids : logi NA NA NA NA NA NA ...
$ dates_ev : Factor w/ 1962 levels "","2000-2002;2002-2004",..: 1915 1915 1805 1598 1535 1471 1673 377 1222 1393 ...
$ ha_ev : Factor w/ 60888 levels "","0.09;0.09",..: 48590 58608 48335 59113 55724 3322 39314 9977 18755 36365 ...
$ SHAPE_Leng: num 6000 6780 3480 5520 2580 ...
$ SHAPE_Area: num 176400 231300 89100 239400 100800 ...
答案 0 :(得分:0)
通过将日期和ha组合为列来创建一个表。由于此处未指定格式,因此可能必须用“;”将字符串分割成元素。如果它已经以正确的格式导入到R中,则可以在合并列之前跳过数据操作。然后按条件在数据框中引用相应的列
datos.dates_ev <- c("
2010-2012;2012-2013;2014-2015
2010-2012;2012-2013;2014-2015
2006-2008;2010-2012;2014-2015")
datos.ha_ev <- c("
3.96;10.08;3.60
7.83;12.24;3.06
3.87;4.23;0.81")
datos.dates_ev <- str_split(gsub("\n", ";", datos.dates_ev), ";")
datos.ha_ev <- str_split(gsub("\n", ";", datos.ha_ev), ";")
datos <- cbind(as.data.frame(datos.dates_ev), as.data.frame(datos.ha_ev))
colnames(datos) <- c("dates", "ha")
datos[datos$dates=="2014-2015",]
答案 1 :(得分:0)
不清楚您要做什么。我假设您想在两列中“取消嵌套”以分号分隔的条目。
这是一个tidyverse
选项
library(tidyverse)
df.long <- df %>%
mutate_all(~str_split(.x, ";")) %>%
unnest()
df.long
# datos.dates_ev datos.ha_ev
#1 2010-2012 3.96
#2 2012-2013 10.08
#3 2014-2015 3.60
#4 2010-2012 7.83
#5 2012-2013 12.24
#6 2014-2015 3.06
#7 2006-2008 3.87
#8 2010-2012 4.23
#9 2014-2015 0.81
然后可以使用filter
选择条目的子集;例如从时段2010-2012
中选择条目
df.long %>% filter(datos.dates_ev == "2010-2012")
# datos.dates_ev datos.ha_ev
#1 2010-2012 3.96
#2 2010-2012 7.83
#3 2010-2012 4.23
df <- read.table(text =
" datos.dates_ev datos.ha_ev
1 2010-2012;2012-2013;2014-2015 3.96;10.08;3.60
2 2010-2012;2012-2013;2014-2015 7.83;12.24;3.06
3 2006-2008;2010-2012;2014-2015 3.87;4.23;0.81")
答案 2 :(得分:0)
根据OP的描述,存在一个数据帧,其中包含两个字符列datos.dates_ev
和datos.ha_ev
。
如果我理解正确,那么OP希望将两个字符列分隔为新表,其中datos.dates_ev
包含datos.ha_ev
的标题。最后,他想通过datos.dates_ev
计算聚合。
# dataframe
datos <- structure(list(
datos.dates_ev = c("2010-2012;2012-2013;2014-2015", "2010-2012;2012-2013;2014-2015",
"2006-2008;2010-2012;2014-2015"),
datos.ha_ev = c("3.96;10.08;3.60", "7.83;12.24;3.06", "3.87;4.23;0.81")),
class = "data.frame", row.names = c(NA, -3L))
将两列都拆分为子字符串,并将其整形为长格式,从而将datos.ha_ev
从字符串强制转换为数字,以便以后进行计算:
library(data.table)
long <- setDT(datos)[
, unlist(lapply(.SD, stringr::str_split, ";"), recursive = FALSE),
by = .(rn = 1:nrow(datos))][
, datos.ha_ev := as.numeric(datos.ha_ev)]
long[]
rn datos.dates_ev datos.ha_ev 1: 1 2010-2012 3.96 2: 1 2012-2013 10.08 3: 1 2014-2015 3.60 4: 2 2010-2012 7.83 5: 2 2012-2013 12.24 6: 2 2014-2015 3.06 7: 3 2006-2008 3.87 8: 3 2010-2012 4.23 9: 3 2014-2015 0.81
编辑:
请注意,strsplit()
仅拆分字符参数,否则抛出错误。现在,OP公开了生产数据集包含因子变量而不是字符。因此,strsplit()
已被stringr::str_split()
取代,后者也拆分了因子变量。
与R等效的基数function(x) strsplit(as.character(x), ";")
需要更多的输入。
长格式非常适合于进一步的数据操作。
重塑为宽格式:
dcast(long, rn ~ datos.dates_ev)
rn 2006-2008 2010-2012 2012-2013 2014-2015 1: 1 NA 3.96 10.08 3.60 2: 2 NA 7.83 12.24 3.06 3: 3 3.87 4.23 NA 0.81
以不同方式分组和聚合:
long[, sum(datos.ha_ev), by = datos.dates_ev]
datos.dates_ev V1 1: 2010-2012 16.02 2: 2012-2013 22.32 3: 2014-2015 7.47 4: 2006-2008 3.87
或宽格式:
dcast(long, . ~ datos.dates_ev, sum)
. 2006-2008 2010-2012 2012-2013 2014-2015 1: . 3.87 16.02 22.32 7.47