2012-08-07 68 views
2

我是R新手。我正在使用具有一个关键变量的比较面板数据集,该变量是时间截面,因此我有在这段时间内平均所有变量。生成一个新变量,用于平均R组中的一行的行数

数据的格式如下:行是国家观察值,列是可变年份。

我构造的本示例:

cname<- c("ARGENTINA", "BOLIVIA", "CHILE", "CHINA", "ECUADOR", "EGYPT") 
gdp2003<- c(1.5, 2.3, 5.2, 12, 2.3, 3.3) 
gdp2004<- c(1.7, 2.2, 4.7, 13.3, 1.7, 1.5) 
corrupt2003<- c(5.1, 6.7, 3.4, 5.5, 4.5, 8.7) 
corrupt2004<- c(4.5, 5.4, 2.4, 4.5, 5.4, 8.9) 
df<- data.frame(cbind(cname, gdp2003, gdp2004, corrupt2003, corrupt2004)) 
df 

其产生这样的输出:

 cname gdp2003 gdp2004 corrupt2003 corrupt2004 
1 ARGENTINA  1.5  1.7   5.1   4.5 
2 BOLIVIA  2.3  2.2   6.7   5.4 
3  CHILE  5.2  4.7   3.4   2.4 
4  CHINA  12 13.3   5.5   4.5 
5 ECUADOR  2.3  1.7   4.5   5.4 
6  EGYPT  3.3  1.5   8.7   8.9 

我想创建可由国家OBS这样平均该列变量的函数:

 cname gdp2003 gdp2004 corrupt2003 corrupt2004 new.col.gdp new.col.corrupt 
1 ARGENTINA  1.5  1.7   5.1   4.5   1.6    4.8 
2 BOLIVIA  2.3  2.2   6.7   5.4  2.25   6.05 
3  CHILE  5.2  4.7   3.4   2.4  4.95    2.9 
4  CHINA  12 13.3   5.5   4.5  12.65    5 
5 ECUADOR  2.3  1.7   4.5   5.4   2   4.95 
6  EGYPT  3.3  1.5   8.7   8.9   2.4    8.8 

任何帮助,将不胜感激。

+0

rowMeans。那是你在找什么?此外,您的代码在大多数行的末尾还有额外的括号。 – sayhey69 2012-08-07 00:59:00

+1

请确保您的数字数据不首先保存为因子,否则在尝试应用答案时会出现错误并且没有结果!您的最后一个data.frame创建行应该是'df < - data.frame(cname,gdp2003,gdp2004,corrupt2003,corrupt2004)'以使事情正常工作。 – thelatemail 2012-08-07 01:42:34

回答

2

你可以只在特定的列

df$new.col.gdp <- rowMeans(df[,2:3]) 
df$new.col.corrupt <- rowMeans(df[,3:4]) 

使用rowMeans现在,让我们说,你真的不知道所有你想数列,但您知道,他们将所有包含的东西常见的名称。假设它是'gdp'。你可以使用类似的东西。

selectColumns <- grep('gdp', names(df)) 
df$new.col.gdp <- rowMeans(df[,selectColumns]) 
+0

'rowMeans' - 'M' not'm' - 就是这样。 :-) – thelatemail 2012-08-07 01:44:06

+0

fixed .......... – John 2012-08-07 02:03:16

3

首先,您需要更改命令创建数据帧。通过使用cbind(),您将所有数字列转换为文本(以匹配文本的cname列),然后在创建data.frame时将这些文本列转换为因子,并将data.frame名称更改为DF避免函数DF()的任何冲突:

DF<- data.frame(cname, gdp2003, gdp2004, corrupt2003, corrupt2004) 
vars <-c("gdp","corrupt") 
new.cols <- sapply(vars, function(i) rowMeans(DF[, grepl(i, colnames(DF))])) 
colnames(new.cols) <- paste0(colnames(new.cols), ".mean") 
DF <- data.frame(DF, new.cols) 
DF 
+0

我知道dataframe命令已将它们更改为因子,但不是 – Ryan 2012-08-07 03:29:13

+0

。 。 。确定如何将它们更改回数字。无论如何,这是诀窍。谢谢! – Ryan 2012-08-07 04:37:37

2

虽然所提供的解决方案,到目前为止肯定会工作,我会建议以不同的方式构建您的数据您在这里结合数据和字段的名称。而不是一字段名为“gdp2003”,你应该真的只需要一个名为“gdp”的字段,并且有另一个字段叫做“year”,然后在2003年有gdp记录。有关此方法的更多信息,我强烈建议阅读Hadley Wickham的论文Tidy Data

这里是你如何修改你的方法来设置数据了这种方式:

df <- data.frame(country=cname, year=2003, gdp=gdp2003, 
       corrupt=corrupt2003) 
df <- rbind(df, data.frame(country=cname, year=2004, 
       gdp=gdp2004, corrupt=corrupt2004)) 

您的数据帧现在应该是这样的:

 country year gdp corrupt 
1 ARGENTINA 2003 1.5  5.1 
2 BOLIVIA 2003 2.3  6.7 
3  CHILE 2003 5.2  3.4 
4  CHINA 2003 12.0  5.5 
5 ECUADOR 2003 2.3  4.5 
6  EGYPT 2003 3.3  8.7 
7 ARGENTINA 2004 1.7  4.5 
8 BOLIVIA 2004 2.2  5.4 
9  CHILE 2004 4.7  2.4 
10  CHINA 2004 13.3  4.5 
11 ECUADOR 2004 1.7  5.4 
12  EGYPT 2004 1.5  8.9 

在这种形式下,你会发现它更后来更容易添加数据,并仍然使用您的代码来计算平均值。这样做的一个方法是使用by

by(df[,-(1:2)], df$country, colMeans) 

,这将给你平均的列表:

df$country: ARGENTINA 
    gdp corrupt 
    1.6  4.8 
------------------------------------------------------------ 
df$country: BOLIVIA 
    gdp corrupt 
    2.25 6.05 

[etc] 

你可以把这个回这样一个更好的表:

t(simplify2array(by(df[,-(1:2)], df$country, colMeans))) 

      gdp corrupt 
ARGENTINA 1.60 4.80 
BOLIVIA 2.25 6.05 
CHILE  4.95 2.90 
CHINA  12.65 5.00 
ECUADOR 2.00 4.95 
EGYPT  2.40 8.80 

为了更加灵活地处理整齐的数据,请查看plyr包。

ddply(df, .(country), summarise, gdp=mean(gdp), corrupt=mean(corrupt)) 

如果你想要的方式和原来的结果(例如,如果要计算从手段每年不同):

ddply(df, .(country), transform, gdp.m=mean(gdp), corrupt.m=mean(corrupt)) 

     country year gdp corrupt gdp.m corrupt.m 
1 ARGENTINA 2003 1.5  5.1 1.60  4.80 
2 ARGENTINA 2004 1.7  4.5 1.60  4.80 
3 BOLIVIA 2003 2.3  6.7 2.25  6.05 
4 BOLIVIA 2004 2.2  5.4 2.25  6.05 
5  CHILE 2003 5.2  3.4 4.95  2.90 
6  CHILE 2004 4.7  2.4 4.95  2.90 
7  CHINA 2003 12.0  5.5 12.65  5.00 
8  CHINA 2004 13.3  4.5 12.65  5.00 
9 ECUADOR 2003 2.3  4.5 2.00  4.95 
10 ECUADOR 2004 1.7  5.4 2.00  4.95 
11  EGYPT 2003 3.3  8.7 2.40  8.80 
12  EGYPT 2004 1.5  8.9 2.40  8.80 
相关问题