【发布时间】:2015-04-09 14:38:55
【问题描述】:
我有一个使用随机森林模型制作的概率数据框。我现在需要清理数据框,只保留第一列的前 3 行,然后是第二列的下 3 行,然后是第三列的最后 3 行。我是 R 的新手,并且尝试过基本的 for 循环,但我需要做的似乎是为基本的 for 循环进阶。任何人都可以帮忙吗? 这是我需要数据经过的过程。
X1 X2 X3 X1 X2 X3 X1
0.672 0.012 0 0.672 NA NA 0.672
0.636 0.066 0.002 0.636 NA NA 0.636
0.68 0.018 0.016 0.68 NA NA 0.68
0.716 0.028 0.044 NA 0.028 NA 0.716
0.628 0.024 0.002 --> NA 0.0024 NA --> 0.628
0.662 0.006 0.024 NA 0.006 NA 0.006
0.716 0.016 0.022 NA NA 0.022 0.016
0.636 0.004 0.122 NA NA 0.122 0.004
0.848 0.014 0.01 NA NA 0.01 0.014
实际上数据框要大得多,我将每 200 行执行一次。
【问题讨论】:
-
你可以试试:
df[cbind(1:nrow(df), rep(1:3, each = 3))] -
你可以做
indx <- cbind(1:nrow(df2), rep(1:3, each=3)) ; indx1 <- which(!is.na(df2), arr.ind=TRUE); df2[indx1[!do.call(paste, as.data.frame(indx1)) %in% do.call(paste, as.data.frame(indx)),]] <- NA -
@docendodiscimus 我喜欢您的回答,因为它很简单,但是当我尝试将其扩展到使用的真实 df 时。它不起作用。真正的 df 有 2800 行和 14 列。所以我需要为每列保留每 200 行。我不太确定 rep 是如何工作的,但是当我尝试 df[cbind(1:nrow(df), rep(1:200, each = 14))] 时,它会出错。当我尝试 df[cbind(1:nrow(df), rep(1:200, each = 200))] 时也会出错。
-
@BenHansen 我认为应该是
df[cbind(1:nrow(df), rep(1:14,each=200))],但是要获得您显示的输出,您必须进行一些额外的修改。 -
@docendodiscimus 我想通了。对于我真正的 df,我做 df[cbind(1:nrow(df), rep(1:14, each = 200))]。谢谢。