根据第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的平均值
谢谢!
答案 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
来做到快速(尽管我的解释违背了快速实现的目的)。