2014-01-09 80 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))