Мы можем использовать cSplit
из splitstackshape
library(splitstackshape)
cSplit(df1, c("TrendLimits2001", "TrendLimits2002"), sep=",")
Или, используя base R
, с помощью read.csv
, создать базовое имя столбцов ('v1') и paste
значение года в виде суффикса с paste0
и rep
, затем l oop над столбцами, для которых в именах столбцов есть 'TrendLimits' в качестве подстроки, читается с помощью read.csv
, связывает list
data.frames с cbind
и обновить исходный набор данных с помощью присвоения
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
data
df1 <- structure(list(Species = c("Dog", "Cat", "Mouse"), Trend2001 = c(-1.5,
2.3, 0.65), TrendLimits2001 = c("-1,-1.64", "2.0,3.1", "-0.3,1.0"
), Trend2002 = c(-1, 1.75, 1.02), TrendLimits2002 = c("-0.56,-2.0",
"1,2.2", "-0.1,1.5")), class = "data.frame", row.names = c(NA,
-3L))