【问题标题】:loop deleting every i rows of every i column in r循环删除r中每i列的每i行
【发布时间】: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))]。谢谢。

标签: r function loops for-loop


【解决方案1】:

你可以试试

 lst <- split(seq_len(nrow(df2)),as.numeric(gl(nrow(df2), 3, nrow(df2))))

 df2[] <- Map(function(x,y) replace(x, which(!seq_along(x) %in% y),
                            NA) , df2, lst)

 df2
 #     X1    X2    X3
 #1 0.672    NA    NA
 #2 0.636    NA    NA
 #3 0.680    NA    NA
 #4    NA 0.028    NA
 #5    NA 0.024    NA
 #6    NA 0.006    NA
 #7    NA    NA 0.022
 #8    NA    NA 0.122
 #9    NA    NA 0.010

数据

 df2 <- structure(list(X1 = c(0.672, 0.636, 0.68, 0.716, 0.628, 
 0.662, 
 0.716, 0.636, 0.848), X2 = c(0.012, 0.066, 0.018, 0.028, 0.024, 
 0.006, 0.016, 0.004, 0.014), X3 = c(0, 0.002, 0.016, 0.044, 0.002, 
 0.024, 0.022, 0.122, 0.01)), .Names = c("X1", "X2", "X3"),
 row.names = c(NA, -9L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2013-04-26
    • 2015-07-05
    相关资源
    最近更新 更多