从R中的多个列中分离字符串

从R中的多个列中分离字符串,r,multiple-columns,delimiter-separated-values,R,Multiple Columns,Delimiter Separated Values,我有一个看起来有点像这样的数据集 Species Trend2001 TrendLimits2001 Trend 2002 TrendLimits2002 Dog -1.5 -1,-1.64 -1.0 -0.56,-2.0 Cat 2.3 2.0,3.1 1.75 1,2.2 Mouse 0.65 -0.3,1.0

我有一个看起来有点像这样的数据集

Species   Trend2001   TrendLimits2001   Trend 2002   TrendLimits2002
 Dog        -1.5        -1,-1.64          -1.0         -0.56,-2.0 
 Cat         2.3         2.0,3.1           1.75          1,2.2 
 Mouse       0.65       -0.3,1.0          1.02         -0.1,1.5
我想将“TrendLimits”列分为两列,分别称为LowerLimits和UpperLimits。我知道如何分别对每一列执行此操作,但是有没有一种方法可以让R根据它们存在的事实拆分所有列?在我的实际数据集中,有100多列需要拆分,我不想为每一列都写代码

我希望我的数据最后看起来是

Species   Trend2001    LowerLimits2001   UpperLimits2001  Trend 2002   LowerLimits2002    UpperLimits2002
 Dog        -1.5           -1                -1.64          -1.0         -0.56                -2.0 
 Cat         2.3           2.0                3.1           1.75          1                    2.2 
 Mouse       0.65         -0.3                1.0           1.02         -0.1                  1.5

我对R很陌生,所以请给出详细的答案:)提前谢谢

我们可以从
splitstackshape

library(splitstackshape)
cSplit(df1, c("TrendLimits2001", "TrendLimits2002"), sep=",")

或者使用
base R
,使用
read.csv
,创建列的基本名称(“v1”)并
paste0
rep
将年份值粘贴为后缀,然后在列名称中具有“TrendLimits”作为子字符串的列上循环,使用
read.csv进行读取
使用
cbind
绑定data.frames的
列表
,并通过赋值更新原始数据集

v1 <- c("LowerLimits", "UpperLimits")
nm1 <- paste0(v1, rep(2001:2002, each = length(v1)))
nm2 <- grep("TrendLimits", names(df1), value = TRUE)
df1[nm1] <- do.call(cbind, lapply(df1[nm2], function(x)
     read.csv(text = as.character(x), header = FALSE)))
df1[nm2] <- NULL
df1
#  Species Trend2001 Trend2002 LowerLimits2001 UpperLimits2001 LowerLimits2002 UpperLimits2002
#1     Dog     -1.50     -1.00            -1.0           -1.64           -0.56            -2.0
#2     Cat      2.30      1.75             2.0            3.10            1.00             2.2
#3   Mouse      0.65      1.02            -0.3            1.00           -0.10             1.5

v1我们可以从
splitstackshape

library(splitstackshape)
cSplit(df1, c("TrendLimits2001", "TrendLimits2002"), sep=",")

或者使用
base R
,使用
read.csv
,创建列的基本名称(“v1”)并
paste0
rep
将年份值粘贴为后缀,然后在列名称中具有“TrendLimits”作为子字符串的列上循环,使用
read.csv进行读取
使用
cbind
绑定data.frames的
列表
,并通过赋值更新原始数据集

v1 <- c("LowerLimits", "UpperLimits")
nm1 <- paste0(v1, rep(2001:2002, each = length(v1)))
nm2 <- grep("TrendLimits", names(df1), value = TRUE)
df1[nm1] <- do.call(cbind, lapply(df1[nm2], function(x)
     read.csv(text = as.character(x), header = FALSE)))
df1[nm2] <- NULL
df1
#  Species Trend2001 Trend2002 LowerLimits2001 UpperLimits2001 LowerLimits2002 UpperLimits2002
#1     Dog     -1.50     -1.00            -1.0           -1.64           -0.56            -2.0
#2     Cat      2.30      1.75             2.0            3.10            1.00             2.2
#3   Mouse      0.65      1.02            -0.3            1.00           -0.10             1.5

v1,仍然需要我为每一列命名特定的列。有没有一种方法可以在不命名列的情况下完成此操作?我有100多列,如果我使用cSplit@CamiHurtado在这里,我假设您的列名是TrendLimits,所以基本的R解决方案是用Mind中的这个来创建的。您能解释一下吗?我不想写下每一列的名称,例如c(“TrendLimits2001”、“TrendLimits2002”…等)或新的列名,例如c(“LowerLimits2001”、“UpperLimits2001”、“LowerLimits2002”、“UpperLimits2002”),以及您作为解决方案编写的两个代码都写出来。@Camihurto在第二个解决方案中,我用
paste
rep
进行了更新(如果您已选中)。唯一指定的是
v1@CamiHurtado我猜您也希望删除TrendLimits原始列,对吧?这仍然需要我为每个列命名特定的列。有没有一种方法可以在不命名列的情况下完成此操作?我有100多列,如果我使用cSplit@CamiHurtado在这里,我假设您的列名是TrendLimits,所以基本的R解决方案是用Mind中的这个来创建的。您能解释一下吗?我不想写下每一列的名称,例如c(“TrendLimits2001”、“TrendLimits2002”…等)或新的列名,例如c(“LowerLimits2001”、“UpperLimits2001”、“LowerLimits2002”、“UpperLimits2002”),以及您作为解决方案编写的两个代码都写出来。@Camihurto在第二个解决方案中,我用
paste
rep
进行了更新(如果您已选中)。唯一指定的是
v1@CamiHurtado我想您也希望删除TrendLimits原始列,对吗?
tidyverse
中的
separate
函数也很有用。
tidyverse
中的
separate
函数也很有用。