簡體   English   中英

列中的條件替換-R

[英]Conditional replacement in columns - R

我想通過從現有列“ 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)

該錯誤是由於使用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)
data$b = ieflse(data$a != 0, data$a - z, 0)

嘗試這個:

#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

這是您數據的可復制版本:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM