繁体   English   中英

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

[英]Separating string from multiple columns in R

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

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 很陌生,所以请给出详细的答案:) 提前致谢!

我们可以使用cSplitsplitstackshape

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

或者使用base Rread.csv ,创建列的基名 ('v1') paste年份值paste为后缀为paste0rep ,然后循环遍历具有 '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

数据

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM