R 如何在与列相关的情况下使用Apply函数?
我试图在一个700k记录的df中填充一个新列,它在for循环中运行得太慢,因此希望使用apply函数。不熟悉它,下面是我的尝试,但这不起作用。请帮忙R 如何在与列相关的情况下使用Apply函数?,r,R,我试图在一个700k记录的df中填充一个新列,它在for循环中运行得太慢,因此希望使用apply函数。不熟悉它,下面是我的尝试,但这不起作用。请帮忙 myfunc <- function(a,b,c,d) {if (a=="xyz" & b==11) {c=d}} dataf[,'target'] <- apply(dataf, 1, function(dataf) myfunc(dataf[,'col1'],dataf[,'col2'],dataf[,'target'],d
myfunc <- function(a,b,c,d) {if (a=="xyz" & b==11) {c=d}}
dataf[,'target'] <- apply(dataf, 1, function(dataf) myfunc(dataf[,'col1'],dataf[,'col2'],dataf[,'target'],dataf[,'col3']))
我想要达到的目标:
a b c d
x 2 p
x 2 p
x 2 p
xyz 11 p p
xyz 11 p p
xyz 2 p
y 2 p
y 2 p
y 2 p
考虑到你的行动,我猜你想要这个
library(data.table)
setDT(dataf)[a == "xyz" & b == 11, c := d]
输出:
a b d c
1: x 2 p NA
2: x 2 p NA
3: x 2 p NA
4: xyz 11 p p
5: xyz 11 p p
6: xyz 2 p NA
7: y 2 p NA
8: y 2 p NA
9: y 2 p NA
我强烈建议您阅读data.table的内容,它速度非常快,可以用于很多不同的事情。在这个网站上你可以找到更多。我会把它们都读一遍,你会需要所有这些,它会帮你很多 请提供一个可复制的例子,准确地告诉我们你想要什么:只是一个简单的玩具例子,它类似于你的大问题;看起来您所做的事情根本不需要函数,只需要简单的子集即可完成,比如:
library(data.table)setDT(dataf)[col1==“xyz&col2==11,target:=col3]
这将使一切都变得更快;请参阅此数据简介。表:我添加了示例。此外,我将您的建议用于setDT。它工作得非常快。但是,我的目标是:=粘贴(“x”,col3,sep=”“)它同时更新了target和col3,正确的方法应该是什么?谢谢!我在这个例子中尝试了这个方法,而另一个例子中它似乎没有完全按照预期工作。我做了c:=粘贴(“x”,d,sep=”“)它用新的值更新了c和d,正确的方法应该是什么?另外,数据的速度给我留下了深刻的印象。table,我今天晚些时候将学习它。如果没有看到一些示例数据,很难判断,我想在阅读了更多关于数据的内容后,您可以回答自己的问题。table,您打算在那里做什么?如果您想将c设置为“x”而不仅仅是键入c:=“x”
;此外,如果这回答了您的问题,请单击箭头接受答案并向上投票,这确实会根据我的问题回答我的问题。然而,我想知道为什么当我稍微调整它时,同样的情况不会发生。代替c:=d,我做了c:=paste(“x”,d,sep=“”),即我尝试做c=d,并且在条件为真时连接和“x”。当我这样做的时候,它也更新了dhmm专栏,这将是一个很好的新问题:),老实说,我不知道
a b d c
1: x 2 p NA
2: x 2 p NA
3: x 2 p NA
4: xyz 11 p p
5: xyz 11 p p
6: xyz 2 p NA
7: y 2 p NA
8: y 2 p NA
9: y 2 p NA