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