首页 > 解决方案 > 在R中的函数内使用if语句

问题描述

我正在尝试迭代一组给定的值,其中对于每个新值,循环通过从 1 重新开始来开始添加数字。代码如下所示。

rdt2 <- function(z){
  i = 1
  k = 1
  v = 0
  b = z[1]
  while (i <= length(z)){
    v[i] = z[i]*100 + k
    if (v[i] == b){
      k = k + 1
    }
    if (v[i] != b){
      b[i] = v[i]
      k = 1
    }
    i = i + 1
  }
  return(v)
}

此代码会抛出值,但不会抛出递增的值。让 z 为

c(2150L, 2151L, 2151L, 2151L, 2151L, 2151L, 2151L, 2152L, 2153L, 
2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2154L, 
2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2156L, 
2156L, 2156L, 2156L, 2156L, 2156L)

如您所见,有不同频率的数字。我希望每个数字循环以该频率运行以获得新的数字集。这旨在根据 B 列填充 A 列。这是数据

structure(list(V1 = c(2150L, 2151L, 2151L, 2151L, 2151L, 2151L, 
2151L, 2152L, 2153L, 2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 
2152L, 2152L, 2154L, 2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 
2155L, 2155L, 2156L, 2156L, 2156L, 2156L, 2156L, 2156L), V2 = c(1L, 
2L, 2L, 2L, 2L, 2L, 2L, 4L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L), 
    V3 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA), V4 = c(1L, 12L, 17L, 22L, 25L, 29L, 31L, 
    6L, 11L, 3L, 5L, 6L, 9L, 14L, 18L, 19L, 24L, 23L, 2L, 4L, 
    7L, 8L, 15L, 21L, 27L, 28L, 10L, 13L, 16L, 20L, 26L, 30L)), row.names = c(NA, 
-32L), class = "data.frame")

现在,如果您看到 V1,则这些值与 V2 一致,这意味着 V1 对于 V2 中的每个唯一值都具有相同的值。现在我想以检查 V2 和 V4 的条件的方式填充 V3。我的意思是,对于 V2 = 2 和 V4 = 12,V3 可以有 215101。因此,有一个循环控制 V2 中的值发生的次数,但是有一个增量,并且循环重新启动以获取 V2 中的下一个唯一值。

标签: rfunctionif-statement

解决方案


您没有准确地说出您想要什么输出,但我猜您正试图通过乘以 100 并添加该重复值的计数器来提供与具有重复的输入相对应的唯一值。也许你想要这样的东西

rdt2a <- function(z){
  v = numeric(length(z))
  uniquez = unique(z)
  freqz = numeric(length(uniquez))
  for (i in 1:length(z)){
    n = which(uniquez == z[i])
    freqz[n] = freqz[n] + 1
    v[i] = z[i] * 100 + freqz[n]
    }
  return(v)
  }

z = c(2150L, 2151L, 2151L, 2151L, 2151L, 2151L, 2151L, 2152L, 2153L, 
2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2152L, 2154L, 
2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2155L, 2156L, 
2156L, 2156L, 2156L, 2156L, 2156L)

rdt2a(z)

#  [1] 215001 215101 215102 215103 215104 215105 215106 215201 215301 215202
# [11] 215203 215204 215205 215206 215207 215208 215209 215401 215501 215502
# [21] 215503 215504 215505 215506 215507 215508 215601 215602 215603 215604
# [31] 215605 215606

推荐阅读