我有一个数据框,其中包含每个美国邮政编码的中位数工资以及该邮政编码中的所有快餐店。以下是该数据框的示例:
Row_NUM ZIP MEDIAN RESTAURANT
26800 1001 56663 McDonald's
33161 1007 79076 McDonald's
23706 1008 63980 McDonald's
23709 1008 63980 McDonald's
30007 1008 63980 Taco Bell
30008 1008 63980 McDonald's
30009 1011 63476 McDonald's
24429 1013 36578 McDonald's
15323 1020 50058 KFC
29196 1020 50058 McDonald's
33127 1020 50058 McDonald's
39362 1020 50058 Wendy's
44914 1020 50058 Taco Bell
2542 1027 58573 Burger King
35242 1027 58573 McDonald's
我想做两件事。 首先,我想创建一个新的数据框,其中只有唯一的邮政编码,该邮政编码的中位数工资以及该邮政编码中餐馆的总数。因此,对于此数据框样本:
ZIP MEDIAN TOTAL_RESTAURANTS
1001 56663 1
1007 79076 1
1008 63980 4
其次,我想创建一个只有唯一邮政编码的数据框和一个包含每种快餐店总数的列。所以对于这个数据框样本:
ZIP MEDIAN TOTAL_MCDONALDS TOTAL_TACOBELL TOTAL_KFC
1001 56663 1 0 0
1007 79076 1 0 0
1008 63980 3 1 0
我认为下面的代码可以使用,但它只给我邮政编码和总餐厅,我不知道如何修改它以包含其他三列。
df <- ddply(df,~ZIP, summarise,TOTAL_RESTAURANTS=length(RESTAURANT))
非常感谢任何帮助。
编辑:这是我在数据框中使用的数据类型。
str(df)
data.frame': 50002 obs. of 3 variables:
$ ZIP : int 44126 24014 77011 2190 48509 21061 43213 70130 31907 19422 ...
$ MEDIAN : int 54496 50175 27113 74205 50895 62408 36734 47591 38710 103683 ...
$ RESTAURANT: Factor w/ 10 levels "McDonald's","Burger King",..: 2 2 2 2 2 2 2 2 2 2 ...
这是我的会话信息:
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11 (El Capitan)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] graphics grDevices utils datasets grid stats methods base
other attached packages:
[1] lubridate_1.3.3 extrafont_0.17 jsonlite_0.9.16 dplyr_0.4.2 tidyr_0.2.0 tableplot_0.3-5 reshape2_1.4.1 RCurl_1.95-4.7
[9] bitops_1.0-6 gplots_2.17.0 ggthemes_2.2.1 ggplot2_1.0.1
loaded via a namespace (and not attached):
[1] Rcpp_0.12.0 Rttf2pt1_1.3.3 magrittr_1.5 MASS_7.3-43 munsell_0.4.2 colorspace_1.2-6 R6_2.1.1
[8] stringr_1.0.0 plyr_1.8.3 caTools_1.17.1 tools_3.2.2 parallel_3.2.2 gtable_0.1.2 KernSmooth_2.23-15
[15] DBI_0.3.1 extrafontdb_1.0 gtools_3.5.0 lazyeval_0.1.10 assertthat_0.1 digest_0.6.8 memoise_0.2.1
[22] labeling_0.3 gdata_2.17.0 stringi_0.5-5 scales_0.3.0 proto_0.3-10
答案 0 :(得分:7)
Uisng dplyr
和reshape2
,这将是一种方法。由于您希望按ZIP
汇总数据,因此您可以使用该变量对数据进行分组。我不清楚的一件事是每个ZIP的MEDIAN值是否相同。在这里,我假设你可能有不同的价值观。因此,我使用了median()
。使用n()
,您可以了解有多少快餐店。
summarize(group_by(mydf, ZIP), mid = median(MEDIAN), total = n())
#If you have an identical MEDIAN for each ZIP, you could do;
summarize(group_by(mydf, ZIP), mid = first(MEDIAN), total = n())
# ZIP mid total
# (int) (dbl) (int)
#1 1001 56663 1
#2 1007 79076 1
#3 1008 63980 4
#4 1011 63476 1
#5 1013 36578 1
#6 1020 50058 5
#7 1027 58573 2
对于第二部分,您可以使用dcast()
。你想看看快餐店有多少种快餐店。通过ZIP
和MEDIAN
的组合,您可以要求R检查存在多少商店(RESTAURANT)。
dcast(mydf, ZIP + MEDIAN ~ RESTAURANT, length, value.var = "RESTAURANT")
# ZIP MEDIAN BurgerKing KFC McDonald's TacoBell Wendy's
#1 1001 56663 0 0 1 0 0
#2 1007 79076 0 0 1 0 0
#3 1008 63980 0 0 3 1 0
#4 1011 63476 0 0 1 0 0
#5 1013 36578 0 0 1 0 0
#6 1020 50058 0 1 2 1 1
#7 1027 58573 1 0 1 0 0
如果您使用data.table
,则可以执行以下操作。
library(data.table)
setDT(mydf)[, list(mid = first(MEDIAN), total = .N), by = ZIP][]
# If you calculate median
setDT(mydf)[, list(mid = as.double(median(MEDIAN)), total = .N), by = ZIP][]
dcast(setDT(mydf), ZIP + MEDIAN ~ RESTAURANT, fun = length, value.var = "RESTAURANT")
数据强>
mydf <-structure(list(Row_NUM = c(26800L, 33161L, 23706L, 23709L, 30007L,
30008L, 30009L, 24429L, 15323L, 29196L, 33127L, 39362L, 44914L,
2542L, 35242L), ZIP = c(1001L, 1007L, 1008L, 1008L, 1008L, 1008L,
1011L, 1013L, 1020L, 1020L, 1020L, 1020L, 1020L, 1027L, 1027L
), MEDIAN = c(56663L, 79076L, 63980L, 63980L, 63980L, 63980L,
63476L, 36578L, 50058L, 50058L, 50058L, 50058L, 50058L, 58573L,
58573L), RESTAURANT = structure(c(3L, 3L, 3L, 3L, 4L, 3L, 3L,
3L, 2L, 3L, 3L, 5L, 4L, 1L, 3L), .Label = c("BurgerKing", "KFC",
"McDonald's", "TacoBell", "Wendy's"), class = "factor")), .Names = c("Row_NUM",
"ZIP", "MEDIAN", "RESTAURANT"), class = "data.frame", row.names = c(NA,
-15L))