2014-01-09 72 views
-1

我想通过从现有列'a'中减去值'z'来创建新列'b'。但是,如果列'a'中的值为0,我想保留它们为0.列中的条件替换 - R

我尝试了以下创建新列y的内容,然后要求编译器更改如果它们的值与0-z相同,则新列返回到0。

我似乎无法得到这个,因为我得到一个错误信息

"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

错误是由于使用data$y作为i ndex。相反,你需要data$y比较data$b

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对'z * as.logical(data $ a)',美。 – zx8754

1
data$b = ieflse(data$a != 0, data$a - z, 0) 
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 
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))