首页 > 解决方案 > 如果条件发生在 for 循环中,则选择第 i 个元素

问题描述

我有一个这样的数据框(df):

Rif   dd    A   A   A   A   A   B   B   B   B   B   C   C   C   C   C
a1    10    5   8   10  2   6   9   6   5   7   9   1   5   6   4   5
b1    20    12  7   1   5   9   10  5   3   8   7   3   6   1   9   8
c1    100   11  6   8   1   14  1   11  9   3   6   10  8   13  8   4
d1    70    4   3   7   8   11  19  2   6   7   1   20  18  7   10  7

我有一个矢量图

rif <- c(0, 15, 50, 90, 110)

我想在 df 中添加一个列,如果 dd(i) >= rif(i-1) & dd(i)

Rif   dd    A   A   A   A   A   B   B   B   B   B   C   C   C   C   C  V1
a1    10    5   8   10  2   6   9   6   5   7   9   1   5   6   4   5  8 
b1    20    12  7   1   5   9   10  5   3   8   7   3   6   1   9   8  1
c1    100   1   6   8   1   14  1   11  9   3   6   10  8   13  8   4  14
d1    70    4   3   7   8   11  19  2   6   7   1   20  18  7   10  7  8

对于 Bs 和 Cs 列,V2 和 V3 也应该这样做。

ref <- c(0, 15, 50, 90, 110)

for (i in 2:length(ref)) {
  for (j in 1:nrow(df)) {
    if (df$dd >= ref[i-1] && df$dd< ref[i]) {
      df[,"V1"] <- df[j,i]
    } 
  }
}

我收到以下错误:

Error in if (..)  : 
  missing value where TRUE/FALSE needed

可能 if 命令不是正确的。你可以帮帮我吗?

标签: rfor-loopif-statementselectelement

解决方案


我认为您只需要更好地指定行和列:

df <- data.frame(
      c("a1","b1","c1","d1")
      , c(10,20,100,70), c(5,12,11,4), c(8,7,6,3), c(10,1,8,7), c(2,5,1,8), c(6,9,14,11)
      , c(9,10,1,19), c(6,5,11,2), c(5,3,9,6), c(7,8,3,7), c(9,7,6,1)
      , c(1,3,10,20), c(5,6,8,18), c(6,1,13,7), c(4,9,8,10), c(5,8,4,7)
)

colnames(df) <- c("Rif", "dd", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C")

ref <- c(0, 15, 50, 90, 110)

for (i in 2:length(ref)) {
  for (j in 1:nrow(df)) {      
    if (df$dd[j] >= ref[i-1] && df$dd[j] < ref[i]) {
      df$V1[j] <- df[j,i+2]
      df$V2[j] <- df[j,i+2+5]
      df$V3[j] <- df[j,i+2+10]
    } 
  }
}

这使:

  Rif  dd  A A  A A  A  B  B B B B  C  C  C  C C V1 V2 V3
1  a1  10  5 8 10 2  6  9  6 5 7 9  1  5  6  4 5  8  6  5
2  b1  20 12 7  1 5  9 10  5 3 8 7  3  6  1  9 8  1  3  1
3  c1 100 11 6  8 1 14  1 11 9 3 6 10  8 13  8 4 14  6  4
4  d1  70  4 3  7 8 11 19  2 6 7 1 20 18  7 10 7  8  7 10

推荐阅读