R使用其他表中多列的平均值创建表

时间:2015-01-31 23:44:47

标签: r

我有一张桌子:

> head(TiposMotivA)
  Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20 Q21
1  5  4  4  4  6  6  7  6  4   6   6   6   4   4   4   4   6   7   4   4   6
2  5  4  4  5  5  5  5  5  5   5   7   5   4   3   1   6   6   5   6   7   7
3  4  5  4  4  5  4  5  4  5   4   5   4   5   4   5   4   5   4   5   4   5
4  5  5  7  7  4  6  6  6  7   7   6   7   7   6   6   7   4   7   6   6   7
5  6  1  7  6  7  7  7  7  7   7   6   7   2   2   3   6   3   7   7   7   7
6  4  4  3  3  4  5  4  3  4   7   6   6   4   4   6   4   5   7   6   6   7

这是它的看法:

> dput(head(TiposMotivA))
structure(list(Q1 = c(5L, 5L, 4L, 5L, 6L, 4L), Q2 = c(4L, 4L, 
5L, 5L, 1L, 4L), Q3 = c(4L, 4L, 4L, 7L, 7L, 3L), Q4 = c(4L, 5L, 
4L, 7L, 6L, 3L), Q5 = c(6L, 5L, 5L, 4L, 7L, 4L), Q6 = c(6L, 5L, 
4L, 6L, 7L, 5L), Q7 = c(7L, 5L, 5L, 6L, 7L, 4L), Q8 = c(6L, 5L, 
4L, 6L, 7L, 3L), Q9 = c(4L, 5L, 5L, 7L, 7L, 4L), Q10 = c(6L, 
5L, 4L, 7L, 7L, 7L), Q11 = c(6L, 7L, 5L, 6L, 6L, 6L), Q12 = c(6L, 
5L, 4L, 7L, 7L, 6L), Q13 = c(4L, 4L, 5L, 7L, 2L, 4L), Q14 = c(4L, 
3L, 4L, 6L, 2L, 4L), Q15 = c(4L, 1L, 5L, 6L, 3L, 6L), Q16 = c(4L, 
6L, 4L, 7L, 6L, 4L), Q17 = c(6L, 6L, 5L, 4L, 3L, 5L), Q18 = c(7L, 
5L, 4L, 7L, 7L, 7L), Q19 = c(4L, 6L, 5L, 6L, 7L, 6L), Q20 = c(4L, 
7L, 4L, 6L, 7L, 6L), Q21 = c(6L, 7L, 5L, 7L, 7L, 7L)), .Names = c("Q1", 
"Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", 
"Q12", "Q13", "Q14", "Q15", "Q16", "Q17", "Q18", "Q19", "Q20", 
"Q21"), row.names = c(NA, 6L), class = "data.frame")

我需要的是使用此表列创建另一个表。它必须具有以下结构: A列值来自Q1和Q11列的平均值 B列值来自Q10和Q21列的平均值

预计最终结果为:

     A    B
1  5.5    6
2    6    6
3  4.5  4.5
4  5.5    7
5    6    7
6    5    7

为了帮助您理解,计算是:

1A = (6 + 5) / 2
1B = (6 + 6) / 2
And so on... 

我可以用它来做这个吗?

我认为这个可以解决问题,但我错了......

> c(mean(c(TiposMotivA$Q1,TiposMotivA$Q11)),mean(c(TiposMotivA$Q11,TiposMotivA$Q21)))
[1] 5.645161 6.395161

但是不是计算每一行的平均值,而是从每行中的所有值中取平均值,然后计算平均值。 然后我尝试了这个:

Teste$A <- tapply(TiposMotivA$Q1,TiposMotivA$Q11,mean)
Teste$B <- tapply(TiposMotivA$Q10,TiposMotivA$Q21,mean)

再没有成功......我知道我必须远离我的需要,所以我求助... 任何线索都会非常感激!

3 个答案:

答案 0 :(得分:5)

dplyr的解决方案:

library(dplyr)                  #load library
new_df <- df %>%
          #use mutate to create the mean columns                   
          mutate(A=(Q1+Q11)/2, B=(Q10+Q21)/2 ) %>% 
          select(A,B)             #only select A and B which you need

或者

new_df <- transmute(df, A=(Q1+Q11)/2, B=(Q10+Q21)/2)

<强>输出

new_df
    A   B
1 5.5 6.0
2 6.0 6.0
3 4.5 4.5
4 5.5 7.0
5 6.0 7.0
6 5.0 7.0

答案 1 :(得分:2)

这是一种不使用任何外部库的方法,但更加简洁,难以阅读。

data.frame(A=(TiposMotivA$Q1+TiposMotivA$Q11)/2, B=(TiposMotivA$Q10+TiposMotivA$Q21)/2)

答案 2 :(得分:1)

以下是使用data.table

的选项
library(data.table)
#if the columns are to be created in the same dataset 
setDT(TiposMotiva)[,c('A', 'B'):= list((Q1+Q11)/2, (Q10+Q21)/2)]
#if you need another dataset with the newly created columns
DTNew <- setDT(TiposMotiva)[, list(A=(Q1+Q11)/2, B=(Q10+Q21)/2)]

或在rowMeans中使用base R。如果有NAs

,这将非常有用
 as.data.frame(sapply(list(TiposMotiva[c('Q1', 'Q11')], 
               TiposMotiva[c('Q10', 'Q21')]), rowMeans, na.rm=TRUE))

或者如果需要对许多列进行此操作(即从相应的n列获取每行的平均值),我们可以在将子集数据集放入列表后使用Reduce。此处,“均值”将位于列1 and 112 and 123 and 13等之间。(注意:在给定数据集中,模式不是特定的(即Q1 and Q11Q10 and Q21))

n <- 2
Reduce(`+`, list(TiposMotiva[1:10], TiposMotiva[11:20]))/n

f1 <- function(x,y) colMeans(rbind(x,y), na.rm=TRUE)
df1 <- setNames(TiposMotiva[1:10], LETTERS[1:10])
df1[] <- Map(f1,  TiposMotiva[1:10], TiposMotiva[11:20])