我正在处理两个数据框,第二个是df2
,是单列,包含变量的名称,第一个,df1
,是一个多列(超过1000),包含每个变量的数值。
VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD")
Num1 <- c(1, 2, 1, 3, 4, 4, 6, 2)
Num2 <- c(3, 3, 2, 1, 1, 2,4, 4)
Num3 <- c(2, 2, 3, 4, 3, 5, 5, 7)
df <- data.frame(VAL1, Num1, Num2, Num3)
df1<-df[,-1]
df2<- df1[1]
在df1
上,我做了以下操作:
tot<- colSums(df1,na.rm = TRUE)
prod<- df1/rep(tot,each = nrow(df1))
在此操作之后,我联合了df1
和df2
:
df3<-cbind(df2, prod)
作为上一个操作,我想按第一列名称(val1)
聚合数据agg<- aggregate(. ~ val1, df3, sum)
但是执行此操作控制台会出现以下错误:
Error in aggregate.data.frame(lhs,mf[-1L],FUN=FUN,...): no rows to aggregate.
我在聚合之前控制了df3
,但这正是我想要的:
Val1 Num1 Num2 ....
AA 2 3
AA 1 5
BB 3 3
BB 7 8
CD 4 5
... ... ...
答案 0 :(得分:2)
理解您想要计算的内容并不太难。但是你原来的帖子不是以读者友好的方式制作的;特别是,不可重复。我通过仔细的重组编辑了,但发现我不能产生你在那里的错误。我得到的错误实际上是var1 is not found
。
无论如何,以下代码可以满足您的期望:
VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD")
Num1 <- c(1, 2, 1, 3, 4, 4, 6, 2)
Num2 <- c(3, 3, 2, 1, 1, 2,4, 4)
Num3 <- c(2, 2, 3, 4, 3, 5, 5, 7)
df <- data.frame(VAL1, Num1, Num2, Num3)
df1 <- df[,-1]
## you should not put df2 <- df1[1], but use df2 <- df[1]
## because variable names are stored in the 1st col of "df"
df2 <- df[1]
tot <- colSums(df1, na.rm = TRUE)
prod <- df1 / rep(tot,each = nrow(df1))
df3 <- cbind(df2, prod)
## use "VAL1", not "val1", as this is the column name used in "df3"
## you can check column names by "colnames(df3)"
agg <- aggregate(. ~ VAL1, df3, sum)
注释行突出显示了实施中的错误/拼写错误。
答案 1 :(得分:0)
我到达这里时遇到了同样的错误(Error in aggregate.data.frame(lhs,mf[-1L],FUN=FUN,...): no rows to aggregate.
),但是我的问题不同。
我的电话就像
df2 = aggregate(. ~ mycolname, data=df1, FUN=mean)
问题是我的专栏之一仅包含NA。我通过添加na.action=na.pass
(在我的情况下是相关的)解决了该错误。