Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过分解另一个变量在R中创建新变量_R_Variables_Dplyr - Fatal编程技术网

通过分解另一个变量在R中创建新变量

通过分解另一个变量在R中创建新变量,r,variables,dplyr,R,Variables,Dplyr,我有一个非常大的数据帧,但我感兴趣的变量要点如下: A B 1 DW 2 DI 3 RW 4 RI 5 DW 6 RI 7 RW 8 DI 我想分解变量B,这样我可以创建一个只反映B中第一个字母的变量和一个只反映B中最后一个字母的变量 为此,我的数据框将有两个额外的变量,结果如下 A B C D 1 DW D W 2 DI D I 3 RW R W 4 RI R I 5 D

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

A    B
1    DW
2    DI
3    RW
4    RI
5    DW
6    RI
7    RW
8    DI
我想分解变量
B
,这样我可以创建一个只反映
B
中第一个字母的变量和一个只反映
B
中最后一个字母的变量

为此,我的数据框将有两个额外的变量,结果如下

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
我的数据帧有100000多行。如何让R自动执行此操作


谢谢你的帮助

我们可以使用
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这里是一个基本的R解决方案

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

下面是一个在base 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

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)))
)
虽然随着字符串的加长,增益会有所减小。例如,添加第三个字符并修改上述内容:

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