如何跨2个不是因素的数据框列运行摘要统计信息?

时间:2015-08-22 04:32:22

标签: r

一些背景知识:

我有一个包含~10k行和5列的数据框,我从SQL数据库导入了这些数据框。其中一列包含一个URL,其余的包含一些其他变量,即整数和字符的混合。这是表的一个示例,括号中每列的类:

     URL(char)   A(char)   B(char)   C(int)   
1    http://      ab         gh        11       
2    http://      cd         ij        14      
3    http://      ef         kl        11      
...

当将SQL服务器中的表读入R时,我没有使用stringsAsFactors,因为我需要做的部分是拆分URL以从中提取几个字符串:

  1. 城市名称
  2. 职业类型
  3. 工资
  4. 这很酷,我要使用正则表达式并从URL中获取我需要的内容,并为每个URL创建一个新列。以下是我为这座城市所做的一个例子。

    dF$city= str_extract_all(string = dF$source_url, pattern = "newyork|los_angeles|chicago|houston|philadelphia|phoenix|san_antonio|san_diego|dallas")
    

    完成后,数据框如下所示:

         URL(char)   A(char)   B(char)   C(int)   City(list)   Occupation(list)   Salary(list) 
    1    http://      ab         gh        11       NY            programmer          90
    2    http://      cd         ij        14       SF            ditch digger        85
    3    http://      ef         kl        11       LA            programmer          88
    ...
    

    冷却。现在我感觉很好,并决定运行摘要统计。具体来说,我想找到列表中每个职业的平均工资(大约有十几种不同类型,都是统一拼写)。由于我仍然在R中接受循环,我一直在这里撞墙 - 我怎样才能弄清楚每个城市和职业如何获得平均工资?

    请注意,我正在尝试在stringsAsFactors设置为false的条件下完成所有这些操作,以便我可以正则表达/ grep URL的必要部分。

    有人有任何建议吗?

1 个答案:

答案 0 :(得分:1)

这是一个简化版本,其中数据框只有' A''城市','职业''工资&# 39 ;.工资有简单的数字,因此您可以快速直观地检查结果是否准确。

实际上非常简单(手指交叉)。您只需使用unlist

另一件事,我不会太依赖使用因素,或者觉得你必须使用它们。在这种情况下,根本不需要因素。

无论如何,这里的代码是:

library('dplyr')
library('stringr')

source_URL应该像你拥有的那样:

source_URL <- c('NYblahditch digger10', 'NYhassomeprogrammermaking20', 'IheartNYditch digger30', 'NYnotNJprogrammer40', 'SFsmellsditch diggers50', '60programmerSF', 'ditch diggerInSFmakes70kayear', 'SFarewedoneyet80programmer')

现在我们创建数据框:

df <- data.frame(A=c('ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op'))
df$City <- unlist(str_extract_all(string = source_URL, pattern = "NY|SF"))           
df$Occupation <- unlist(str_extract_all(string = source_URL, pattern = "ditch digger|programmer"))
df$Salary <- as.numeric(unlist(str_extract_all(string = source_URL, pattern = '10|20|30|40|50|60|70|80')))

检查以确保数据框看起来像您需要继续的方式:

> str(df)
'data.frame':  8 obs. of  4 variables:
  $ A         : Factor w/ 8 levels "ab","cd","ef",..: 1 2 3 4 5 6 7 8
$ City      : chr  "NY" "NY" "NY" "NY" ...
$ Occupation: chr  "ditch digger" "programmer" "ditch digger" "programmer" ...
$ Salary    : num  10 20 30 40 50 60 70 80

现在使用dplyr

df1 <- group_by(df, City, Occupation) %>%
   summarise(Mean_Wage = mean(Salary))                 

..在这里我们有结果:

> df1
Source: local data frame [4 x 3]
Groups: City

City   Occupation Mean_Wage
1   NY ditch digger  20
2   NY   programmer  30
3   SF ditch digger  60
4   SF   programmer  70