Отделение строки от нескольких столбцов в R - PullRequest
1 голос
/ 28 февраля 2020

У меня есть набор данных, который выглядит примерно так

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, поэтому, пожалуйста, дайте подробные ответы :) Заранее спасибо!

1 Ответ

0 голосов
/ 28 февраля 2020

Мы можем использовать 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))
...