我在data frame
中对R
进行子集时遇到问题。数据框为att2
,其中包含filter_name
列,我希望subset
。unique
。此列的unique(att2[["filter_name"]])
# [1] title Type Operating_System Occasion Brand
148 Levels: Accessories Age Antennae Art_Style Aspect_ratio ... Zoom
值低于。
Brand
这表明filter_name
是att3 <- subset(att2, filter_name == 'Brand')
> att3
[1] a b c filter_name
<0 rows> (or 0-length row.names)
列的值。但是当我使用下面的代码对帧进行子集时,它会给出0行,如下所示。
{{1}}
我无法找出原因。有没有人遇到过这种问题?
答案 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)
使用print
和quote = 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')