从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
函数也很有用。