我有以下数据框(在帖子末尾输入):
> 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")
答案 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
没有使用过包......