在 RI 中,我发现自己经常做这样的事情:
adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1
这种方式有点冗长乏味。有什么方法可以让我
引用我要更改的对象,例如
adataframe[adataframe$col==something]<-$self+1
?
在 RI 中,我发现自己经常做这样的事情:
adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1
这种方式有点冗长乏味。有什么方法可以让我
引用我要更改的对象,例如
adataframe[adataframe$col==something]<-$self+1
?
尝试包data.table及其:=
运算符。它非常快而且非常短。
DT[col1==something, col2:=col3+1]
第一部分col1==something
是子集。您可以在此处放置任何内容并使用列名,就好像它们是变量一样;即,无需使用$
. 然后第二部分col2:=col3+1
将 RHS 分配给该子集中的 LHS,其中列名可以像变量一样分配。:=
是引用赋值。不复制任何对象,因此比<-
、=
和within
快transform
。
此外,很快将在 v1.8.1 中实现,允许类似j
的语法的:=
一个最终目标是将其与 结合,请参阅问题:我何时应该在 data.table 中使用运算符。j
by
:=
UDPDATE :这确实是:=
在 2012 年 7 月(按组)发布的。
您应该更多地关注 Gabor Grothendeick(而不仅仅是在这种情况下。)inc
Matt Asher 博客上引用的函数可以满足您的所有要求:
(并且明显的扩展也有效。)
add <- function(x, inc=1) {
eval.parent(substitute(x <- x + inc))
}
# Testing the `inc` function behavior
编辑:在我对第一条评论没有得到批准感到暂时烦恼之后,我接受了添加另一个函数参数的挑战。提供数据帧一部分的一个参数,它仍然会将值的范围增加一。到目前为止,仅在中缀二元运算符上进行了非常轻微的测试,但我认为它没有理由不适用于仅接受两个参数的任何函数:
transfn <- function(x, func="+", inc=1) {
eval.parent(substitute(x <- do.call(func, list(x , inc)))) }
(认罪:从传统的 R 角度来看,这在某种程度上“感觉不对”,即返回赋值进行赋值。)该inc
函数的早期测试如下:
df <- data.frame(a1 =1:10, a2=21:30, b=1:2)
inc <- function(x) {
eval.parent(substitute(x <- x + 1))
}
#---- examples===============>
> inc(df$a1) # works on whole columns
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 6 25 1
6 7 26 2
7 8 27 1
8 9 28 2
9 10 29 1
10 11 30 2
> inc(df$a1[df$a1>5]) # testing on a restricted range of one column
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 7 25 1
6 8 26 2
7 9 27 1
8 10 28 2
9 11 29 1
10 12 30 2
> inc(df[ df$a1>5, ]) #testing on a range of rows for all columns being transformed
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
# and even in selected rows and grepped names of columns meeting a criterion
> inc(df[ df$a1 <= 3, grep("a", names(df)) ])
> df
a1 a2 b
1 3 22 1
2 4 23 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
这是你可以做的。假设您有一个数据框
df = data.frame(x = 1:10, y = rnorm(10))
你想把所有的都加y
1。你可以很容易地使用transform
df = transform(df, y = y + 1)
我会偏爱(大概子集在行上)
ridx <- adataframe$col==something
adataframe[ridx,] <- adataframe[ridx,] + 1
它不依赖于任何花哨/脆弱的解析,可以合理地表达正在执行的操作,并且不太冗长。也倾向于将线条分解成很好的人类可解析的单元,并且使用标准习语有一些吸引人的地方——R 的词汇和特质已经足够我的口味了。