对于数据框的每一行,检查是否存在重复的值。

3

我有一个包含以下值的数据框:

URL                  Response.Code Count
www.site.com/page1   200             4
www.site.com/page1   301             1
www.site.com/page2   200             5
www.site.com/page3   301             4
www.site.com/page4   200             4
www.site.com/page4   403             1

对于每个唯一的URL值,我想知道是否存在多个Response.Code值。如果只存在一个组合URL/Response.Code,则该URL是一致的。期望输出结果是像这样的数据框:

  URL                  Consistent
  www.site.com/page1   FALSE
  www.site.com/page2   TRUE
  www.site.com/page3   TRUE
  www.site.com/page4   FALSE  

我可以为每个唯一的URL做一个循环,并检查Response.Code中不同值的数量,但这似乎不是解决这个问题的最佳R方式。
你有什么好的建议来解决这个问题吗?我刚接触R,在此处检查了多个重复的问题,但似乎没有找到这个特定问题的解决方案。
4个回答

3
您可以使用 base R 中的 aggregate
aggregate(Response.Code~URL, df, length)[2] == 1

#     Response.Code
#[1,]         FALSE
#[2,]         TRUE
#[3,]         TRUE
#[4,]         FALSE

如果您想按照所需格式输出,那么您可以这样做:
agg <- aggregate(Response.Code~URL, df, length)
new_df <- data.frame(URL = agg$URL, Consistent = agg$Response.Code == 1)
new_df
#    URL               Consistent
#1 www.site.com/page1      FALSE
#2 www.site.com/page2      TRUE
#3 www.site.com/page3      TRUE
#4 www.site.com/page4      FALSE

2
@DirkCeuppens - 你还可以将所有内容放在aggregate调用中,aggregate(Response.Code~URL, df, function(x) length(x) == 1) - Rich Scriven

2

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'URL' 分组,检查行数是否等于 1。

library(data.table)
setDT(df1)[, .(Consistent = .N ==1), by = URL]
#                 URL Consistent
#1: www.site.com/page1      FALSE
#2: www.site.com/page2       TRUE
#3: www.site.com/page3       TRUE
#4: www.site.com/page4      FALSE

如果我们想检查 'Response.Code' 中唯一元素的数量是否为1,我们可以在按 'URL' 分组后使用 uniqueN

setDT(df1)[, .(Consistent = uniqueN(Response.Code)==1), by = URL]
#                  URL Consistent
#1: www.site.com/page1      FALSE
#2: www.site.com/page2       TRUE
#3: www.site.com/page3       TRUE
#4: www.site.com/page4      FALSE

1

我们可以一举三得(base、data.table和dplyr)。

df1 <- structure(list(URL = c("www.site.com/page1", "www.site.com/page1", 
    "www.site.com/page2", "www.site.com/page3", "www.site.com/page4", 
    "www.site.com/page4"), Response.Code = c(200L, 301L, 200L, 301L, 
    200L, 403L), Count = c(4L, 1L, 5L, 4L, 4L, 1L)), .Names = c("URL", 
    "Response.Code", "Count"), class = "data.frame", row.names = c(NA, 
    -6L))

df1 %>%
  group_by(URL) %>%
  summarise(Consistent = n_distinct(Response.Code) == 1)

0
假设你的数据框叫做x,一个可能有效的方法是运行
x$consistent <- duplicated(x[,1:2]) | duplicated(x[,1:2], fromLast = TRUE)

这段代码将仅检查前两列中的重复项,并将TRUE/FALSE值写入新列。默认情况下,duplicated()不会返回所有重复行的TRUE。默认情况下,第一个实例将是FALSE,而第一个实例之后的所有行将是TRUE。通过使x$consistent在有和没有fromLast = TRUE的情况下都为TRUE,我确保所有实例最终都为TRUE

如果您希望输出与您所说的完全相同,则可以运行此代码以删除重复的URL和额外的列:

y <- x[!(duplicated(x$URL), c(1,4)]

这将得到您想要的结果,但如果您对其他内容感兴趣,我建议阅读文档中关于duplicated()的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接