在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