如何在R SUBSTRING函数中实现与SQL中存在的功能类似的功能

时间:2016-02-07 13:05:06

标签: r

我有以下数据框(在帖子末尾输入):

> d2
  a    b     c
1 1 1111  1111
2 2 2222  2222
3 3    3     3
4 4    4 44444
5 5    5     5
6 6    6 66666

我想要做的是用子串(b,1,2)和长度(c)打印数据帧。在SQL中,它将类似于:

select a,substring(b,1,2),length(c) from d2

预期产出:

  a  b c
1 1 11 4
2 2 22 4
3 3  3 1
4 4  4 5
5 5  5 1
6 6  6 5

我如何在R?中做到这一点?

> dput(d2)
structure(list(a = c(1, 2, 3, 4, 5, 6), b = structure(1:6, .Label = c("1111", 
"2222", "3", "4", "5", "6"), class = "factor"), c = structure(1:6, .Label = c("1111", 
"2222", "3", "44444", "5", "66666"), class = "factor")), .Names = c("a", 
"b", "c"), row.names = c(NA, -6L), class = "data.frame")

2 个答案:

答案 0 :(得分:5)

以下是一些不同的方式:

1)sqldf 您的SQL语句可以在R中运行,如下所示:

library(sqldf)
sqldf("select a, substr(b,1,2) b, length(c) c from d2")

,并提供:

  a  b c
1 1 11 4
2 2 22 4
3 3  3 1
4 4  4 5
5 5  5 1
6 6  6 5

2)转换无需依赖任何软件包即可运行:

transform(d2, b = substr(b, 1, 2), c = nchar(as.character(c)))

,并提供:

  a  b c
1 1 11 4
2 2 22 4
3 3  3 1
4 4  4 5
5 5  5 1
6 6  6 5

注意1:这也可以使用dplyr包以基本相同的方式完成,方法是将transform替换为mutate,或者使用data {table包替换dt <- as.data.table(d2); dt[, c("b", "c") := list(substr(b, 1, 2), nchar(as.character(c)))] 1}}

注2: R中substr(x, 1, 2)的替代

substring(x, 1, 2)

sprintf("%2.2s", x)

sub("(..).*", "\\1", x)

paste(strsplit(x, "")[[1]][1:2], collapse = "")

library(gsubfn);  strapplyc(x, "^..", simplify = TRUE)

library(tcltk); `as.character(tcl('string', 'range', x, 0, 1))

答案 1 :(得分:2)

另一种方法是使用sub

transform(d2, b = sub('(.{2}).*', '\\1', b), c = nchar(paste(c)))
#  a  b c
#1 1 11 4
#2 2 22 4
#3 3  3 1
#4 4  4 5
#5 5  5 1
#6 6  6 5

没有使用过包......