Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:用多个规则替换列/向量值的智能方法?_R_Function_Dplyr - Fatal编程技术网

R:用多个规则替换列/向量值的智能方法?

R:用多个规则替换列/向量值的智能方法?,r,function,dplyr,R,Function,Dplyr,我有一些原始值,需要在几个阈值和计算之后重新编码为0-1。这是公式的样子: 我认为这只是说: 如果xx=0 如果x>60&x=0.05*x-3 如果x>80->x=1 以下是我的方法: # V is from 0-600 m3/ha set.seed(3) V_pine = sample.int(100, 10) # generate 10 random numbers up to 100 > V_pine [1] 5 58 12 36 99 95 8 20 74 55 # R

我有一些原始值,需要在几个阈值和计算之后重新编码为0-1。这是公式的样子:

我认为这只是说:

如果x<60->x=0 如果x>60&x=0.05*x-3 如果x>80->x=1 以下是我的方法:

# V is from 0-600 m3/ha
set.seed(3)
V_pine = sample.int(100, 10)  # generate 10 random numbers up to 100

> V_pine
[1]  5 58 12 36 99 95  8 20 74 55

# Recode values following multiple ifelse statements
for (i in V_pine){
  if (i <= 60) {
    i <- 0
    } else if (i > 60 & i<= 80) {
      i <- (0.05* i )-3
    } else if (i > 80) {
      i<- 1
    }
  print(i)
}
然而,由于我还有许多类似的函数/公式,我想知道是否有其他方法可以简化for循环和ifelse语句

我的数据将存储在data.frame中,所以使用dplyr和mutate将非常好。谢谢你的建议

从dplyr开始时,您可以使用case\u:

从dplyr执行以下操作时,可以使用case_:

使用基数R

df$recode <- ifelse(df$V_pine <= 60, 0, ifelse(df$V_pine > 80, 1, df$V_pine*0.05 - 3))
df
使用基数R

df$recode <- ifelse(df$V_pine <= 60, 0, ifelse(df$V_pine > 80, 1, df$V_pine*0.05 - 3))
df

你的解决方案看起来不错。我不认为你用的是正确的种子。我用的是同一个种子,我不知道为什么它给了我不同的数字。也许是因为他用samle.int创建了一个向量,然后我创建了一个数据帧?当我运行代码时,我得到了OP的V_pine值。也许再运行一次看看。你的解决方案看起来不错。我不认为你用的是正确的种子。我用的是同一个种子,我不知道为什么它给了我不同的数字。也许是因为他用samle.int创建了一个向量,然后我创建了一个数据帧?当我运行代码时,我得到了OP的V_pine值。也许再运行一次看看。
     V_pine recode
1      17      0
2      80      1
3      38      0
4      32      0
5      58      0
6      96      1
7      12      0
8      28      0
9      54      0
10     95      1
df$recode <- ifelse(df$V_pine <= 60, 0, ifelse(df$V_pine > 80, 1, df$V_pine*0.05 - 3))
df
   V_pine recode
1       5    0.0
2      58    0.0
3      12    0.0
4      36    0.0
5      99    1.0
6      95    1.0
7       8    0.0
8      20    0.0
9      74    0.7
10     55    0.0