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

R 如何根据其位置连接两列?,r,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 我希望能够将每一列作为一个新表进行操作,这样就可以使用第一个表作为第二个

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

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

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

datos.dates\u ev不太清楚你想做什么。我假设您希望在两列中“取消嵌套”分号分隔的条目

这里有一个
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

样本数据
df根据OP的描述,有一个数据框,包含两个字符列
datos.dates\u ev
datos.ha\u ev

如果我理解正确,OP希望将两个字符列分离到新表中,
datos.dates\u ev
包含
datos.ha\u ev
的标题。最后,他希望通过
datos.dates\u 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))

编辑: 请注意,
strsplit()
将只拆分字符参数,否则将抛出错误。现在,OP已经披露生产数据集包含因子变量而不是字符。因此,
strsplit()

基本R等价的
函数(x)strsplit(如.character(x),“;”)
需要更多的键入


长格式非常适合于进一步的数据处理

重塑为宽格式:

dcast(long, rn ~ datos.dates_ev)
dcast(long, . ~ datos.dates_ev, sum)
以不同方式分组和聚合:

long[, sum(datos.ha_ev), by = datos.dates_ev]
或以宽幅格式:

dcast(long, rn ~ datos.dates_ev)
dcast(long, . ~ datos.dates_ev, sum)

丹尼尔,请包括你的预期产出。不清楚你到底想要什么。请给我们更多的信息。你的解决方案正是我想要做的。但是,当运行长行时,我得到了以下错误:“error in FUN(X[[I]],…):非字符参数”。这可能是由于因子而不是字符造成的。请你检查一下这两个栏目的
str(datos)
显示了什么?我已经编辑了主要帖子,显示了所有数据的str,我在示例中使用的变量是:“dates_ev”和“ha_ev”。@DanielGuerrero,感谢你更新帖子。我已经用
stringr::str_split()
替换了
strsplit()
,它也接受因子变量,而
strsplit()
抛出一个错误。
   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