通过分解另一个变量在R中创建新变量[重复]

Posted

技术标签:

【中文标题】通过分解另一个变量在R中创建新变量[重复]【英文标题】:Create New Variable in R by breaking up another variable [duplicate] 【发布时间】:2020-04-25 04:57:53 【问题描述】:

我有一个非常大的数据框,但我感兴趣的变量的要点如下所示:

A    B
1    DW
2    DI
3    RW
4    RI
5    DW
6    RI
7    RW
8    DI

我想分解变量B,以便创建一个仅反映B 中的第一个字母的变量和一个仅反映B 中的最后一个字母的变量。

为此,我的数据框将有 2 个额外的变量,导致看起来像这样

A    B    C  D
1    DW   D  W
2    DI   D  I
3    RW   R  W
4    RI   R  I
5    DW   D  W
6    RI   R  I
7    RW   R  W
8    DI   D  I

我的数据框有超过 100,000 行。如何让 R 自动执行此操作?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我们可以通过separate 做到这一点

library(tidyr)
library(dplyr)
df1 %>%
   separate(B, into = c('C', 'D'), sep= 1, remove = FALSE)
#  A  B C D
#1 1 DW D W
#2 2 DI D I
#3 3 RW R W
#4 4 RI R I
#5 5 DW D W
#6 6 RI R I
#7 7 RW R W
#8 8 DI D I

数据

df1 <- structure(list(A = 1:8, B = c("DW", "DI", "RW", "RI", "DW", "RI", 
"RW", "DI")), class = "data.frame", row.names = c(NA, -8L))

【讨论】:

【参考方案2】:

这是一个基本的 R 解决方案

df <- cbind(df,`names<-`(data.frame(do.call(rbind,strsplit(df$B,""))),c("C","D")))

这样

> df
  A  B C D
1 1 DW D W
2 2 DI D I
3 3 RW R W
4 4 RI R I
5 5 DW D W
6 6 RI R I
7 7 RW R W
8 8 DI D I

【讨论】:

【参考方案3】:

这是在基础 R 中使用 substr 的解决方案:

cbind(df, 'C' = substr(df$B, 1, 1), 'D' = substr(df$B, nchar(df$B), nchar(df$B)))

#  A  B C D
#1 1 DW D W
#2 2 DI D I
#3 3 RW R W
#4 4 RI R I
#5 5 DW D W
#6 6 RI R I
#7 7 RW R W
#8 8 DI D I

【讨论】:

【参考方案4】:

OP 注意到数据框的大小。因此,对提出的三种方法进行基准测试似乎是值得的:

library(microbenchmark)

df <-
  tibble(
    A = 1:100000,
    B = paste0(sample(LETTERS,100000,replace=T),sample(LETTERS,100000,replace=T))
  )

microbenchmark(
  tidyr = df %>%
    separate(B, into = c('C', 'D'), sep= 1, remove = FALSE),
  strsplit = cbind(df,`names<-`(data.frame(do.call(rbind,strsplit(df$B,""))),c("C","D"))),
  substr = cbind(df, 'C' = substr(df$B, 1, 1), 'D' = substr(df$B, nchar(df$B), nchar(df$B)))
)

使用separate()tidyr 解决方案明显更快:

Unit: milliseconds
     expr     min       lq     mean   median       uq      max neval
    tidyr 10.9737 11.99655 13.59860 13.32865 13.98510  28.6455   100
 strsplit 39.4084 42.33310 47.20898 46.13145 51.55815  67.0940   100
   substr 42.3147 47.90830 54.42131 51.05375 55.79760 184.6317   100

尽管弦长时增益会有所降低。例如,添加第三个字符并调整上述内容:

Unit: milliseconds
     expr     min      lq     mean   median       uq      max neval
    tidyr 17.6609 19.7422 24.06847 21.75830 22.93855  54.1001   100
 strsplit 43.7746 58.0660 69.91389 64.69815 72.97280 199.4662   100
   substr 50.8109 56.5016 65.98295 59.53490 65.45865 154.3368   100

【讨论】:

以上是关于通过分解另一个变量在R中创建新变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中的空数据框中创建新列[重复]

如何使用 R 语言在基于多个二进制变量的数据框中创建新变量?

测试变量向量并在表上求和,在R中创建新列

在bash中创建一个循环脚本,其中2个变量递增,第二个变量根据第一个变量[重复]

如何在 100 多个现有类中创建新的类变量?

使用正则表达式在 Pandas 数据框中创建新列 [重复]