R将公式和条件逻辑应用于数据框

时间:2020-05-22 23:18:09

标签: r dplyr tidyverse mutate

我有一个数据框,其中包含样品(例如土壤)的湿重和干重的数字变量。在此数据帧中,某些值等于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

任何建议将不胜感激。

3 个答案:

答案 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