如何使用True/False信息计算条件和



我很难弄清楚如何根据第3&4

我有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

所以我试图找到col1/col2的平均值,例如,如果col3=F和col4=T

谢谢!

您需要根据这两个条件对数据进行子集设置。您可以使用[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

这里有一个使用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是每个条件组合的平均产量。

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

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

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("对应于这里的"(公斤作物/公顷("。

如果这是真的,您可以在数据集中创建一个新列(此处命名为"data"(,用于"yield",方法是:

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=C&col4+T(,但代码将为您提供所有可能性。

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

最新更新