我想通过从现有列'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)
答案 0 :(得分:4)
错误是由于使用data$y
作为索引。相反,您需要将data$b
与data$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)
)
您可以使用ifelse
为b
提供不同的值,具体取决于a
的值。 with
函数允许您访问数据框内的变量,从而无需多次键入data
。
data$b <- with(data, ifelse(a == 0, 0, a - z))