在R中循环数据帧长度的正确方法
经过今天的大量调试,令我沮丧的是,我发现:在R中循环数据帧长度的正确方法,r,loops,R,Loops,经过今天的大量调试,令我沮丧的是,我发现: for (i in 1:0) { print(i) } 实际上,在R中分别打印1和0。写入时出现了问题 for (i in 1:nrow(myframe) { fn(i) } 如果nrow(myframe)==0,我本来打算根本不执行它。正确的更正是否只是: if (nrow(myvect) != 0) { for (i in 1:nrow(myframe) { fn(i) } } 或者有没有更
for (i in 1:0) {
print(i)
}
实际上,在R中分别打印1和0。写入时出现了问题
for (i in 1:nrow(myframe) {
fn(i)
}
如果nrow(myframe)==0,我本来打算根本不执行它。正确的更正是否只是:
if (nrow(myvect) != 0) {
for (i in 1:nrow(myframe) {
fn(i)
}
}
或者有没有更合适的方法来实现我在R中想要的功能?您可以使用
seq\u来代替:
vec <- numeric()
length(vec)
#[1] 0
for(i in seq_along(vec)) print(i) # doesn't print anything
vec <- 1:5
for(i in seq_along(vec)) print(i)
#[1] 1
#[1] 2
#[1] 3
#[1] 4
#[1] 5
vec关于编辑,请参见对应函数seq_len(NROW(myframe))
。这种用法正是在for()
循环中不使用1:N
的原因,以防最终替换N
的值为0或负值
另一种方法(只是隐藏循环)是执行apply(myframe,1,FUN=foo)
,其中foo
是一个函数,它包含您要对myframe
的每一行执行的操作,并且可能只是从循环体中剪切和粘贴。对于向量,有seq\u
,对于数据帧,您可以使用seq_len
for(i in seq_len(nrow(the.table)){
do.stuff()
}
我认为R中最合适的方法是使用apply
函数。通常,有一个apply
函数可以做到这一点。通常,你不需要序列
下面的示例将diff
应用于每一列或每一行
> d <- data.frame(x = 1:5, y = 6:10)
隔着一排
> apply(d, 1, diff)
[1] 5 5 5 5 5
再次遍历列,返回一个矩阵
> sapply(d, diff)
x y
[1,] 1 1
[2,] 1 1
[3,] 1 1
[4,] 1 1
请参见此链接以了解应用
显然,前面的所有答案都可以完成这项工作
我喜欢这样的东西:
rows_along <- function(df) seq(nrow(df))
完全不同的答案,它只是一个包装。
但我认为它更具可读性/直观性。“我认为R中最合适的方法是使用apply函数”——恕我直言,我认为这不是一个好建议。有两种或两种以上的方法做某事是可以的,但“错误的方法”不可能是最明显的、通常可行的方法,而“正确的方法”就在后面;那只是在搞乱人们的头脑。为了它的价值。
> sapply(d, diff)
x y
[1,] 1 1
[2,] 1 1
[3,] 1 1
[4,] 1 1
rows_along <- function(df) seq(nrow(df))
for(i in rows_along(df)) # do stuff