R - 比较两列中相同值的两个不同长度的数据框

  • 本文关键字:两个 数据 比较 两列 r compare
  • 更新时间 :
  • 英文 :


这是一个关于如何比较不同长度的两个不同数据框的几列的问题。

我有两个不同长度的数据帧(来自接收器 1 (rec1) 和接收器 2 (rec2)的数据),其中包含 4 艘不同船只的位置:

rec1 <- data.frame(name = sample (c("Nina", "Doug", "Alli", "Steve"), 20, replace = TRUE), 
                lon = sample (1:20), 
                lat = sample (1:10)
                )    
rec2 <- data.frame(name = sample (c("Nina", "Doug", "Alli", "Steve"), 30, replace = TRUE), 
                lon = sample (1:30),
                lat = sample (1:30)
                )

它们包含不同的名称(船名,两者的名称相同)和经度(lon)以及纬度(纬度)坐标。

我正在尝试比较两个 df,以查看每艘船的"lon"和"lat"中有多少个值匹配(即两个接收器拾取相同位置的频率)

基本上,我试图找出每个接收器的好坏以及有多少数据点重叠(例如百分比)。

我不确定如何最好地做到这一点,并愿意接受任何建议。多谢!!!

这是一个修改和可重现的测试用例以及我的答案。我设计了测试集,以包括匹配的组合和一些不匹配的组合。

rec1 <- data.frame(shipName = rep(c("Nina", "Doug", "Alli", "Steve"), each = 5), 
                lon = rep.int(c(1:5), 4), 
                lat = rep.int(c(11:15), 4)
                )    
rec2 <- data.frame(shipName = rep(c("Nina", "Doug", "Alli", "Steve"), each = 7), 
                lon = rep.int(c(2, 3, 4, 4, 5, 5, 6), 4),
                lat = rep.int(c(12, 13, 14, 14, 15, 15, 16), 4)
                )
print(rec1)
print(rec2)
#Merge the two data frames together, keeping only those combinations that match
m <- merge(rec1, rec2, by = c("shipName", "lon", "lat"), all = FALSE)
print(m)

如果要计算每个组合出现的次数,请尝试以下操作。(聚合有不同的方法。有些人在这里。以下是我的首选方法,它要求您安装data.table。这是一个很棒的工具,所以如果你还没有安装它,你可能想要安装它。

library(data.table)
#Convert to a data table and optionally set the sort key for faster processing
m <- data.table(m)
setkey(m, shipName, lon, lat)
#Aggregate and create a new column called "Count" with the number of
    #observations in each group (.N)
m <- m[, j = list("Count" = .N), by = list(shipName, lon, lat)]
print(m)
#If you want to return to a standard data frame rather than a data table:
m <- data.frame(m)
<</div> div class="one_answers">

你没有构造一个非常有用的测试用例,但这里有一种方法:

> both <- rbind(data.frame(grp="A", rec1[, 2:3]), data.frame(grp="B", rec2[, 2:3]))
> with(both, table( duplicated(both[,2:3]), grp))
       grp
         A  B
  FALSE 20 30

在基数 R 中进行此比较的最简单方法是使用 merge

试试这个:

# Set the RNG so sample() produces the same output and this example is reproducible
set.seed(720) 
rec1 <- data.frame(name = sample (c("Nina", "Doug", "Alli", "Steve"), 20, replace = TRUE), 
            lon = sample (1:20), 
            lat = sample (1:10)
            )    
rec2 <- data.frame(name = sample (c("Nina", "Doug", "Alli", "Steve"), 30, replace = TRUE), 
            lon = sample (1:30),
            lat = sample (1:30)
            )
merged <- merge(x = rec1,
                y = rec2,
                by = c("name","lat","lon"))
print(merged)

合并的数据框将包含所有三列匹配的所有情况(在本例中为一列)。然后,您可以执行类似 table(merged$name) 的操作来计算每个名称在合并数据中出现的次数。

不过,你的问题让我想知道...这里一定有某种时间元素,是吗?如果在数据中包含测量时间,则可以按名称和时间合并,然后计算测量的纬度纬度差异。

编辑:

我觉得如果我不提到神话般的dplyr软件包,那将是我的失职,这使得这样的分析非常简单。上述唯一名称值的合并和计数是通过这个简单的单行实现的:

inner_join(rec1, rec2) %>% count(name)

相关内容

  • 没有找到相关文章

最新更新