如何根据其位置连接两列?

  • 本文关键字:两列 连接 何根 位置 r
  • 更新时间 :
  • 英文 :


我有一个数据框,其中两列如下:

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 ...

目前还不清楚你想做什么。我假设您想在两列中"取消嵌套"分号分隔的条目。

这是一个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")

通过将日期和 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",]

根据OP的描述,有一个数据帧包含两个字符列datos.dates_evdatos.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