我有一个数据框,其中包含样品(例如土壤)的湿重和干重的数字变量。在此数据帧中,某些值等于0,而其他值则大于零。我想将公式应用于变量以创建新变量,但仅适用于大于零的数据对。到目前为止,我已经尝试了filter
的{{1}}函数。
我想使用以下公式创建新变量:
水分含量=(湿重-干重)/湿重
这是我到目前为止尝试过的代码:
dplyr
我不确定dry_weight <- c(0,1,0,2,0,3,4,5,6,7)
wet_weight <- c(1,0,2,4,0,1,4,0,5,0)
weights <- data.frame(dry_weight, wet_weight)
weights$moisture <- weights %>%
filter(weights$wet_weight > 0, weights$dry_weight >0) %>%
mutate((weights$wet_weight-weights$dry_weight)/weights$wet_weight)
是否是正确的方法,但是当我执行代码时,我得到了:
mutate
任何建议将不胜感激。
答案 0 :(得分:1)
我希望这会帮助您入门。
首先,不需要在每次使用管道(weights$
)时都继续输入%>%
。
其次,对于mutate
,您需要为左侧分配=
。
weights %>%
dplyr::filter(wet_weight > 0 & dry_weight > 0) %>%
mutate(moisture = (wet_weight - dry_weight)/wet_weight)
# dry_weight wet_weight moisture
#1 2 4 0.5
#2 3 1 -2.0
#3 4 4 0.0
#4 6 5 -0.2
请记住,如果要将其分配回weights
,只需在第一行的开头添加weights <-
。
答案 1 :(得分:1)
另一种方法是仅使用base R
:
weights$moisture <-
ifelse(weights$dry_weight*weights$wet_weight > 0
, 1-weights$dry_weight/weights$wet_weight
, NA)
weights
dry_weight wet_weight moisture
1 0 1 NA
2 1 0 NA
3 0 2 NA
4 2 4 0.5
5 0 0 NA
6 3 1 -2.0
7 4 4 0.0
8 5 0 NA
9 6 5 -0.2
10 7 0 NA
ifelse
是带有if
的向量化ifelse(condition, if true then this, if false then that)
。在这里,我检查两个值是否都严格大于零,在这种情况下,我返回水分,否则返回NA
。
答案 2 :(得分:0)
一种矢量化方式:
#Initialize column to NA
weights$moisture <- NA
#Get the index where dry_weight > 0 and wet_weight > 0
inds <- with(weights, dry_weight > 0 & wet_weight >0)
#Calculate using the formula and replace the value.
weights$moisture[inds] <- with(weights,
(wet_weight[inds] - dry_weight[inds])/wet_weight[inds])
weights
# dry_weight wet_weight moisture
#1 0 1 NA
#2 1 0 NA
#3 0 2 NA
#4 2 4 0.5
#5 0 0 NA
#6 3 1 -2.0
#7 4 4 0.0
#8 5 0 NA
#9 6 5 -0.2
#10 7 0 NA