如何根据其位置将两列合并?

时间:2018-08-14 21:57:30

标签: 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 ...

3 个答案:

答案 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_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