【发布时间】:2019-10-22 10:50:42
【问题描述】:
是否有一个“应用”类型的方法允许我们遍历 data.frame 并以与循环完全相同的方式处理行?当我执行apply(df, 1, function(row){...}) 时,传递给函数函数的row 不是实际的data.frame 行。
df = data.frame(A=rnorm(3), B=letters[1:3])
for (i in 1:3)
{
row = df[i,]
print(row)
print(class(row))
print(typeof(row))
print(row$A)
print(row$B)
}
apply(df, 1, function(row)
{
print(row)
print(class(row))
print(typeof(row))
print(row$A)
print(row$B)
})
> df = data.frame(A=rnorm(3), B=letters[1:3])
>
> for (i in 1:3)
+ {
+ row = df[i,]
+ print(row)
+ print(class(row))
+ print(typeof(row))
+ print(row$A)
+ print(row$B)
+ }
A B
1 0.4179416 a
[1] "data.frame"
[1] "list"
[1] 0.4179416
[1] a
Levels: a b c
A B
2 1.35868 b
[1] "data.frame"
[1] "list"
[1] 1.35868
[1] b
Levels: a b c
A B
3 -0.1027877 c
[1] "data.frame"
[1] "list"
[1] -0.1027877
[1] c
Levels: a b c
>
> apply(df, 1, function(row)
+ {
+ print(row)
+ print(class(row))
+ print(typeof(row))
+ print(row$A)
+ print(row$B)
+ })
A B
" 0.4179416" "a"
[1] "character"
[1] "character"
Show Traceback
Rerun with Debug
Error in row$A : $ operator is invalid for atomic vectors
编辑 1
comment to this answer 表示 apply 将 data.frame 转换为矩阵,因此您最终会得到向量。我想这就是问题所在。也许是时候使用专用的data.frame 迭代器了?
编辑 2
正如@thelatemail 指出的那样,这可能真的是For each row in an R dataframe 的副本。
【问题讨论】:
-
我认为没有办法使用
apply来避免它——你可以使用lapply而不是seq_len(nrow(df)),但如果你严格地想避免使用for -
要清楚,这在
?apply中有记录 - “如果 X 不是数组,而是具有非空暗值的类的对象(例如数据框),如果它是二维的(例如,数据框)或通过 as.array,应用尝试通过 as.matrix 将其强制转换为数组。" -
我听到了。但我仍然想知道是否有办法在没有循环的情况下做到这一点。
-
...这是我的第一条评论 -
lapply对行索引lapply(seq_len(nrow(df)), function(x) df[x,] )或根据您链接的问题使用by- stackoverflow.com/a/1699296/496803 -
请尽量避免添加关于人们如何在此处投票的评论,无论是与否决票、潜在重复或问题是否与主题相关。读者将按他们的意愿投票。关于潜在的重复,这些是真诚和乐于助人的精神提供的——如果它们到达就处理它们。没有任何问题作者可以保证 Stack Overflow 没有可能的重复问题。
标签: r dataframe functional-programming apply