用R求数据库列的和
我开始使用R,我的问题很可能很简单,但尽管如此,我还是花了很多时间试图找出我做错了什么,但都没有用 我必须感谢你,因为我上周在搜索其他问题时发现了这个网站。但是现在作为一个新手,常常很难解释别人的代码 我的RStudio版本是:1.1.442 我的问题是,我有两个数据框,一个是几年的数据框,另一个是在几条拖网中发现的数据框,我需要总结数据框中的数据框,并生成另一个变量。其中显示了每年的项目汇总和拖网 因此,我与for做了一个循环,以获得相同的底拖网和相同的年份,以便对项目进行求和 我简化了我的数据库用R求数据库列的和,r,for-loop,sum,frame,R,For Loop,Sum,Frame,我开始使用R,我的问题很可能很简单,但尽管如此,我还是花了很多时间试图找出我做错了什么,但都没有用 我必须感谢你,因为我上周在搜索其他问题时发现了这个网站。但是现在作为一个新手,常常很难解释别人的代码 我的RStudio版本是:1.1.442 我的问题是,我有两个数据框,一个是几年的数据框,另一个是在几条拖网中发现的数据框,我需要总结数据框中的数据框,并生成另一个变量。其中显示了每年的项目汇总和拖网 因此,我与for做了一个循环,以获得相同的底拖网和相同的年份,以便对项目进行求和 我简化了我的数
BT<- c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3)
YEAR<- c(2007, 2007, 2008, 2008, 2008, 2009, 2009, 2009, 2009, 2009)
W<- c(95, 6, 60, 50, 4, 21, 56, 44, 23, 4)
Data1= data.frame(BT,YEAR,W)
Trawl<- c(1, 2, 3)
Year<- c(2007, 2008, 2009)
Data2= data.frame(Trawl,Year)
peso=cbind()
for(i in 1:length(Data1$BT)) {
ind=which(Data2$Trawl == Data1$BT[i] & Data2$Year == Data1$YEAR[i])
print(i)
print(ind)
print(Data1$W[ind])
peso[i]=Data1$W[ind]
sumaGr[i]=colSums(peso[i])
}
BT您似乎正在执行一些拆分应用合并计算。这里有几种方法可以做到这一点
基尔
带有数据。表
if(!require(dplyr)){
安装程序包(“dplyr”)
需要(dplyr)
}#对于“内部连接()”安装和/或加载包dplyr
#重命名以融合两个数据帧
colnames(Data1)欢迎使用StackOverflow!请阅读相关信息以及如何给出建议。这将使其他人更容易帮助您。循环很少是解决R中问题的正确方法。当您有类似于数据库的操作(按年份和BT加入,按BT分组,求PesoGr值之和)时,您应该查看dplyr包和“合并”函数。如果我开始使用merge(Data1、Data2、by.x=c(“BT”、“YEAR”)、by.y=c(“BT”、“YEAR”))来创建一个新的数据帧,然后在新的数据帧上使用dplyr::group_by和dplyr::summary,您可以看到为什么会收到此错误消息:peso
是一个向量,而不是数据帧或矩阵(这是colSums
所期望的),非常感谢您,使用dplyr很容易做到。但是我有一个问题,这个%>%是我们在开始和结束时必须使用的符号吗?%%
是来自magrittr
包的管道操作符。如果继续使用R,您会经常遇到这种情况。因为它在tidyverse
包系列和其他构建在tidy框架之上的包中被采用。对于初学者,键入示例(
%%>,package=“magrittr”)
。无需在每次管道操作时启动新行。例如,Data1%>%groupby(BT,YEAR)%%>%summary(sumaGr=sum(W))%%>%rename(Trawl=BT)
也同样有效。
Data3 <- aggregate(Data1$W, by = list(Data1$BT, Data1$YEAR), sum)
colnames(Data3) <- c("Trawl", "YEAR", "sumaGr")
Data3
Data3 <- Data1 %>%
group_by(BT, YEAR) %>%
summarise(sumaGr = sum(W)) %>%
rename(Trawl = BT)
Data3
library(data.table)
Data3 <- setDT(Data1)[,.(sumaGr = sum(W)), by = .(BT, YEAR)]
setnames(Data2, "BT", "Trawl")
Data3
# Trawl YEAR sumaGr
# 1 1 2007 101
# 2 2 2008 114
# 3 3 2009 148
if(!require(dplyr)) {
install.packages("dplyr")
require(dplyr)
} # for 'inner_join()' install and/or load package dplyr
# Rename for fusion of the two data frames
colnames(Data1) <- c("BT", "Year", "W")
# colnames for 'By=' must look the same!
data1.new <- inner_join(Data1, Data2, by="Year")
# inspect data1.new
data1.new
# split by "Trawl"
df.list <- split(data1.new, data1.new$Trawl)
# summarize each of the data frames in this list
summaries.list <- lapply(df.list, summary)
# But I think what youw ant is colMeans, colSums etc.
colMeans.list <- lapply(df.list, colMeans)
colSums.list <- lapply(df.list, colSums)
# colMeans(df) is acatually function(df) {apply(df, 2, FUN=mean)}
# in this way you can use any variadic function to make it
# applicable to a whole column (variadic functions are those
# which can take any number of arguments).
# if there is a non-variadic function - let's say max():
# let's say
# max() takes only two arguments (that's not true ...)
# but let's assume it takes only two arguments, then
# function(your.vector) Reduce(max, your.vector) makes it variadic
# e.g. maximum of a column:
colMax <- function(df) {apply(df, 2, FUN=function(vec) Reduce(max, vec))}
colMax.list <- lapply(df.list, colMax)
# inspect those objects
colMeans.list
colSums.list
colMax.list
# you can reduce the results using Reduce(rbind, ...)
means.by.trawl.mat <- Reduce(rbind, colMeans.list)
sums.by.trawl.mat <- Reduce(rbind, colSums.list)
maxs.by.trawl.mat <- Reduce(rbind, colMax.list)
# give rownames
rownames(means.by.trawl.mat) <- means.by.trawl.mat[, "BT"]
rownames(sums.by.trawl.mat) <- sums.by.trawl.mat[, "BT"]
rownames(maxs.by.trawl.mat) <- maxs.by.trawl.mat[, "BT"]
# result
> means.by.trawl.mat
BT Year W Trawl
1 1 2007 50.5 1
2 2 2008 38.0 2
3 3 2009 29.6 3
> sums.by.trawl.mat
BT Year W Trawl
2 2 4014 101 2
6 6 6024 114 6
15 15 10045 148 15
> maxs.by.trawl.mat
BT Year W Trawl
1 1 2007 95 1
2 2 2008 60 2
3 3 2009 56 3