列中的条件替换 - R.

时间:2014-01-09 13:49:03

标签: r replace conditional

我想通过从现有列'a'中减去值'z'来创建新列'b'。但是,如果列'a'中的值为0,我希望将它们保留为0.

我在创建新列y时尝试了以下操作,然后要求编译器将新列中的值更改为0(如果它们的值与0-z相同)。

我收到错误消息似乎无法使其正常工作

"Error in `$<-.data.frame`(`*tmp*`, "b", value = c(66, 69, 71, 72, 66,  : 
  replacement has 55 rows, data has 16"  

这是我的数据:

a
11
14
16
17
11
5
0
0
0
0
0
5
7
13
15
17

这是我的代码:

z <- -55


data$y <- (0 - z)
data$b <- (data$a - z) 
data$b[data$y]<- 0
plot(data$b)

4 个答案:

答案 0 :(得分:4)

错误是由于使用data$y作为索引。相反,您需要将data$bdata$y进行比较:

data$y <- (0 - z)
data$b <- (data$a - z) 
data$b[data$b == data$y] <- 0 # changed line

但您可以使用一个命令创建新列b

data$b <- data$a - z * as.logical(data$a)

答案 1 :(得分:1)

data$b = ieflse(data$a != 0, data$a - z, 0)

答案 2 :(得分:1)

试试这个:

#dummy data
df <- read.table(text="
a
11
14
16
17
11
5
0
0
0
0
0
5
7
13
15
17",header=T)

#assing z
z <- -55

#subtract with condition
df$b <- ifelse(df$a==0, df$a, df$a - z) 

#output
df
# a  b
# 1  11 66
# 2  14 69
# 3  16 71
# 4  17 72
# 5  11 66
# 6   5 60
# 7   0  0
# 8   0  0
# 9   0  0
# 10  0  0
# 11  0  0
# 12  5 60
# 13  7 62
# 14 13 68
# 15 15 70
# 16 17 72

答案 3 :(得分:1)

以下是您的数据的可重现版本:

n <- 16
z <- -55
data <- data.frame(
  a = ifelse(runif(n) > 0.5, rnorm(n), 0)
)

您可以使用ifelseb提供不同的值,具体取决于a的值。 with函数允许您访问数据框内的变量,从而无需多次键入data

data$b <- with(data, ifelse(a == 0, 0, a - z))