检查在数据集R中以不同方式分类的变量

时间:2018-04-30 03:09:32

标签: r for-loop if-statement dataframe

我正在尝试在R中编写一些可以解决特定问题的函数。

问题:我有一个包含20,000个观测值的大型数据集。每个观察有13个特征,其中一个是城市,另一个是县。我试图想出一种有效的方法来检查是否有任何城市出现在不同的县。

例如,我在数据中发现了这种异常现象:

City           |  County
San Francisco  |  San Francisco County
San Francisco  |  Alpine County

我正在尝试确定一种检查其他实例的简单方法。

我考虑过使用

table(data$city, data$county)

然而,由于有10个县和数百个城市,它似乎容易出错,所以尝试手动检查在准确性方面似乎不方便。

我正在考虑使用

内的简单for循环
for (x in 1:length(data$city)){
  if (data$city %in%
}

我试图检查该城市是否出现在多个县,以查看是否存在任何地理异常或脏数据。然而,在这种情况下创建一个for循环似乎比应该更难,因为R的设计与C ++之类的语言不同。有人可以帮助我创建一些方法来测试我的问题吗?

2 个答案:

答案 0 :(得分:0)

一种方法是使用tapply()函数:

df <- data.frame(City=c( "city1","city2","city3","city1","city2","city5"), 
                 County = c("a", "b","a","b","a","b"))

df$City[which(tapply(df$County, df$City, length) > 1)]

这将创建以下输出:

> df$City[which(tapply(df$County, df$City, length) > 1, useNames=FALSE)]
[1] city1 city2
Levels: city1 city2 city3 city5

从上面可以看出 - 它将列出哪些城市位于多个地区。

答案 1 :(得分:0)

我们可以使用tidyverse

library(dplyr)
df %>%
  group_by(City) %>% 
  filter(n_distinct(County) > 1) %>% 
  distinct(City)  %>%
  pull(City)
#[1] city1 city2
#Levels: city1 city2 city3 city5