【问题标题】:Filtering values out of two dimensional data in R, comparing themselves从R中的二维数据中过滤值,比较它们自己
【发布时间】:2012-10-15 21:36:59
【问题描述】:

我正在分析美国的选举数据、候选人的贡献等。所以我从互联网上获取了原始数据,并尝试学习一些 R 语言并在其中执行一些练习。这是我使用?summary 成功加载和分析的 CSV 文件。

我还成功地使用了?tapply,将候选人的捐款按州分开:

data_amt_st = tapply(data$contb_receipt_amt, data[c('cand_nm', 'contbr_st')], sum)

?str(对于一个小样本)告诉我这个数据的格式:

> str(data_amt_st)
 num [1:3, 1:21] NA NA 451 NA NA 201 NA NA 200 NA ...
 - attr(*, "dimnames")=List of 2
  ..$ cand_nm  : chr [1:3] "Bachmann, Michele" "Obama, Barack" "Romney, Mitt"
  ..$ contbr_st: chr [1:21] "33" "46" "48" "7" ...

现在我需要从 data_amt_st 中过滤掉值。我需要说明“奥巴马,巴拉克”比其他候选人有更多的贡献,但不知道该怎么做。 ?subset 的东西?

非常感谢。


编辑 1:听大家告诉我的,关于提出一个更具体的问题:我需要一份巴拉克·奥巴马 (Barack Obama) 比其他候选人贡献水平更高(更多钱)的州列表。


编辑 2:试图给你一个可重现的例子(对吗?):

x = c("a", "b", "c")
y0 = c(3, 5, 1)
y1 = c(2, 1, 6)
y2 = c(4, 2, 3)
m = cbind(x, y0, y1, y2)
m
#      x   y0  y1  y2 
# [1,] "a" "3" "2" "4"
# [2,] "b" "5" "1" "2"
# [3,] "c" "1" "6" "3"

现在,我需要知道,对于什么 y 值,a 高于 bc

【问题讨论】:

  • 此外,如果您准确地告诉我们您想要实现的目标,将会很有帮助。 “我需要从 data_amt_st 中过滤掉值”尚不清楚。您要按什么标准过滤?
  • 啊,乔什·奥布莱恩,现在我明白你告诉我“可重现的例子”是什么意思了 :-) 谢谢。
  • 你的矩阵更适合m <- data.frame(y0,y1,y2); rownames(m) <- x;在矩阵中组合字符和数字使它们全部强制转换为矩阵
  • 感谢您添加可重现的示例。您可以通过 df <- as.data.frame(m[,2:4], row.names=m[,1]) 直接将矩阵转换为 Ben Bolker 建议的更好的数据格式。

标签: r statistics data-mining


【解决方案1】:

也许

## max by column (MARGIN=2)
max_amt <- apply(data_amt_st,MARGIN=2,max,na.rm=TRUE)  
data_amt_st[,max_amt==data_amt_st["Obama",]]

? (不确定这将如何与奥巴马行中的 NA 值一起使用:使用 dput 给我们一个可重现的示例(http://tinyurl.com/reproducible-000)会很有用...)

x <- letters[1:3]
y0 <- c(3, 5, 1)
y1 <- c(2, 1, 6)
y2 <- c(4, 2, 3)
m <- data.frame(y0, y1, y2)
rownames(m) <- x
maxvals <- apply(m,2,max,na.rm=TRUE)
which(m["a",]==maxvals)  ## or
names(m)[m["a",]==maxvals]

【讨论】:

  • 可能是which.max() 的好地方,如names(m)[apply(m, 2, which.max)==1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多