我很难弄清楚如何根据第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
来表示快速(尽管我的解释违背了快速的目的(