一些背景知识:
我有一个包含~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以从中提取几个字符串:
这很酷,我要使用正则表达式并从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的必要部分。
有人有任何建议吗?
答案 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