在基于R中的列值对数据帧进行子集化时发布

时间:2013-02-05 06:24:28

标签: r

我在data frame中对R进行子集时遇到问题。数据框为att2,其中包含filter_name列,我希望subsetunique。此列的unique(att2[["filter_name"]]) # [1] title Type Operating_System Occasion Brand 148 Levels: Accessories Age Antennae Art_Style Aspect_ratio ... Zoom 值低于。

Brand

这表明filter_nameatt3 <- subset(att2, filter_name == 'Brand') > att3 [1] a b c filter_name <0 rows> (or 0-length row.names) 列的值。但是当我使用下面的代码对帧进行子集时,它会给出0行,如下所示。

{{1}}

我无法找出原因。有没有人遇到过这种问题?

3 个答案:

答案 0 :(得分:2)

我们所能做的就是猜测你问题的来源是什么。

这是我最好的猜测:你的“filter_name”列中有空格,因此在剥离空格之前,你不应该真正寻找“Brand”。

如果猜测正确,这是一个重现问题的最小例子

首先,一些示例数据:

mydf <- data.frame(Param =  c("   Brand   ", "Operating System", 
                              "Type ", "   Brand   ", "Type ", 
                              "Type ", "   Brand   ", "Type ", 
                              "   Brand   "), Value = 1:9)
unique(mydf[["Param"]])
# [1]    Brand         Operating System Type            
# Levels:    Brand    Operating System Type 

subset(mydf, Param == "Brand")
# [1] Param Value
# <0 rows> (or 0-length row.names)

使用printquote = TRUE参数查看data.frame中的空格:

print(mydf, quote = TRUE)
#                Param Value
# 1      "   Brand   "   "1"
# 2 "Operating System"   "2"
# 3            "Type "   "3"
# 4      "   Brand   "   "4"
# 5            "Type "   "5"
# 6            "Type "   "6"
# 7      "   Brand   "   "7"
# 8            "Type "   "8"
# 9      "   Brand   "   "9"

如果 恰好是您的问题,那么快速gsub应该修复它:

mydf$Param <- gsub("^\\s+|\\s+$", "", mydf$Param)
unique(mydf[["Param"]])
# [1] "Brand"            "Operating System" "Type"  

subset(mydf, Param == "Brand")
#   Param Value
# 1 Brand     1
# 4 Brand     4
# 7 Brand     7
# 9 Brand     9

您可能还想查看strip.white和系列中的read.table参数,默认为FALSE。尝试使用strip.white = TRUE重新读取数据,然后尝试子集化。

答案 1 :(得分:0)

首先,您应该阅读有关如何提出好问题的this stackoverflow帖子。

对于你的问题,这样的事情,(当你没有发布一个可重复的例子时很难,正如Arun也指出的那样)

 att2 <- (data.frame(v=rnorm(10), filter_name=c('Brand','Not Brand')))

 att2[att2$filter_name == 'Brand', ]
            v filter_name
1 -1.84217530       Brand
3 -0.36199449       Brand
5 -0.54431665       Brand
7 -0.05659442       Brand
9  1.29753513       Brand

 subset(att2, filter_name == 'Brand')
            v filter_name
1 -1.84217530       Brand
3 -0.36199449       Brand
5 -0.54431665       Brand
7 -0.05659442       Brand
9  1.29753513       Brand

Here在子设置方面更多。

答案 2 :(得分:0)

使用stringr包,您可以执行类似

的操作
   dat$filter_name_trim <- str_trim(dat$filter_name)
   att3 <- subset(att2, filter_name_trim == 'Brand')