如何计算包含正确/错误信息的条件和?

时间:2019-11-20 18:25:18

标签: r

根据第3列和第4列的True / False值,我很难弄清楚如何对数值值进行划分:(col1)/(col2)。

我有500行数据,我正在尝试根据不同条件计算农作物的平均产量(千克农作物/公顷)。我正在尝试回答“如果第3列的条件为True而第4列的条件为False,则平均收益为多少?”

编辑:这是示例数据。

col 1   col2   col 3   col4
1.5     2.0     T       T
1.5     2.0     F       T
2.5     5.0     F       F
2.5     5.0     F       T

因此,例如,如果col3 = F且col4 = T,我就试图找到col1 / col2的平均值

谢谢!

3 个答案:

答案 0 :(得分:0)

您需要根据两个条件对数据进行子集化。您可以使用[col3 & !col4]来做到这一点,就像这样:

mean(with(data,col1[col3 & !col4]/col2[col3 & !col4]))

({with是一种不必每次都写data$的简便方法。)

例如,这是一些假数据:

data<-data.frame(col1=1:5,col2=10:6,col3=c(TRUE,TRUE,TRUE,FALSE,FALSE),col4=c(FALSE,TRUE,FALSE,FALSE,TRUE))

这是您从我的解决方案中获得的信息:

mean(with(data,col1[col3 & !col4]/col2[col3 & !col4]))
[1] 0.2375

答案 1 :(得分:0)

这是使用tidyverse的解决方案。

首先,我使用函数data.frame创建可复制的数据集。

n <- 100
df <- data.frame(
  kg = runif(n),
  ha = runif(n),
  col3 = sample(c(TRUE,FALSE), n, TRUE),
  col4 = sample(c(TRUE,FALSE), n, TRUE)
)

我们可以使用mutate来计算kg和ha变量的产量,group两种条件下的数据,最后summarize每种条件组合的平均产量。 / p>

df %>% 
  mutate(kg_ha = kg/ha) %>% 
  group_by(col3, col4) %>% 
  summarize(mean_yield = mean(kg_ha))

答案 2 :(得分:0)

首先,我将创建一个可复制的数据集:

data<-data.frame("col1"=rnorm(500),"col2"=rnorm(500),
                 "col3"=c(rep(TRUE,250),rep(FALSE,250)),"col4"=c(rep(FALSE,250),rep(TRUE,250)))

如果我对您的理解正确,我想您的“(col1)/(col2)”对应于此处的“(kg作物/公顷)”。

如果是这样,则可以通过以下方式在数据集中为“ yield”创建一个新列(此处称为“ data”)

data$yield <- data$col1 / data$col2


head(data)
        col1         col2 col3  col4       yield
1  0.8976488  0.006764518 TRUE FALSE 132.6996029
2 -0.2829754  0.980092790 TRUE FALSE  -0.2887230
3 -0.2266733  1.285616004 TRUE FALSE  -0.1763149
4  1.4690071 -0.297252879 TRUE FALSE  -4.9419440
5 -0.1438242  0.917662116 TRUE FALSE  -0.1567289
6 -1.3297183 -0.880964698 TRUE FALSE   1.5093889

然后,可以使用多种方法来查看这些方法。一种“索引”方式是:

mean(data$yield[data$col3==T & data$col4==F])
[1] 1.929354

这是在询问,当col3的数据为True且col4的数据为False时,产量是多少。

但是,如果要汇总所有可能的组组合,则可以通过以下方式使用软件包dplyr

install.packages("dplyr") # This will have to be run only the first time you use the package on one machine
library(dplyr) # This code will need to be run every new R session

data %>% group_by(col3,col4) %>% 
  summarise(
    MeanYield = mean(yield)
  )

# A tibble: 2 x 3
# Groups:   col3 [2]
  col3  col4  MeanYield
  <lgl> <lgl>     <dbl>
1 FALSE TRUE      20.4 
2 TRUE  FALSE      1.93

在这种情况下,只有两种可能性(col3 = T&col4 = F)和(col3 = F&col4 = T),但是代码为您提供了所有可能性。

  • 作为后注:我知道负值可能对作物或公顷没有意义,我只是在这里使用rnorm来做到快速(尽管我的解释违背了快速实现的目的)。