我真的很喜欢使用R中的帧语法。但是,如果我尝试使用apply来执行此操作,它会给出一个错误,即输入是一个向量,而不是一个帧(这是正确的)。有没有与mapply类似的功能,这将让我继续使用框架语法?
df = data.frame(x = 1:5, y = 1:5)
# This works, but is hard to read because you have to remember what's
# in column 1
apply(df, 1, function(row) row[1])
# I'd rather do this, but it gives me an error
apply(df, 1, function(row) row$x)
答案 0 :(得分:2)
您不能在原子矢量上使用$
,但我想您希望将其用于可读性。但您可以使用[
subsetter。
这是一个例子。请在下次提供可重复的示例。如果没有数据,R中的问题特别没有意义。
set.seed(1234)
gidd <- data.frame(region=sample(letters[1:6],100,rep=T),
wbregion=sample(letters[1:6],100,rep=T),
foodshare=rnorm(100,0,1),
consincPPP05 = runif(100,0,5),
stringsAsFactors=F)
apply(gidd, ## I am applying it in all the grid here!
1,
function(row) {
similarRows = gidd[gidd$wbregion == row['region'] &
gidd$consincPPP05 > .8 * as.numeric(row['consincPPP05']),
]
return(mean(similarRows$foodshare))
})
请注意,使用apply我需要转换为数字。
您还可以使用plyr
或data.table
获得干净的语法,例如:
apply(df,1,function(row)row[1]*2)
相当于
ddply(df, 1, summarise, z = x*2)