关于ifelse函数,我有一个非常奇怪的问题:它不会返回一个因子(正如我想的那样),而是类似于因子的位置。
我使用的数据集可以下载here。
..是在df中创建一个新列,其中包含国家/地区的名称,如果该国家/地区属于前12个最常见的国家/地区(在“答案”列中)。否则它应该包含“其他”
...是
... R返回一些非常奇怪的东西:它返回前10个国家的因子级别(1到181之间)的位置,以及其他国家的“其他”(这是正常的)。这一行返回错误的值:
aDDs$answer, ## then it should be named as aDDs$answer **THIS IS THE PROBLEM**
## create a list with most frequent country names
temp <- row.names(as.data.frame(summary(aDDs$answer, max=12))) # create a df or something else with the summary output.
colnames(temp)[1]="freq"
"India" %in% temp #check if it works (yes)
## create new column that filters top results
aDDs$top <- ifelse(
aDDs$answer %in% temp, ## condition: match aDDs$answer with row.names in summary df
aDDs$answer, ## then it should be named as aDDs$answer **THIS IS THE PROBLEM**
"Other" ## else it should be named "Other"
)
View(aDDs)
PS。这是this one的后续问题,因为它有些不同,可能需要单独提问。
答案 0 :(得分:17)
字段answer
是因子,因此您的函数返回数字(因子级别)。
您需要做的是:
aDDs$answer <- as.character(aDDs$answer)
然后它有效。
答案 1 :(得分:3)
那是因为你有一个因素:
ifelse(c(T, F), factor(c("a", "b")), "other")
#[1] "1" "other"
阅读help("ifelse")
中的警告:
结果的模式可能取决于测试的值(参见 例子),以及结果的class属性(参见oldClass) 取自测试,可能不适合从中选择的值 是和否。
有时候最好使用
这样的结构(tmp&lt; - yes; tmp [!test]&lt; - no [!test]; tmp),可能扩展到 处理测试中的缺失值。
答案 2 :(得分:0)
按如下方式修改ifelse
aDDs$top <- ifelse(
aDDs$answer %in% temp, ## condition: match aDDs$answer with row.names in summary df
levels(aDDs$answer)[aDDs$answer], ## then it should be named as aDDs$answer **THIS IS THE PROBLEM**
"Other" ## else it should be named "Other"
)
注意函数levels
和方括号。级别知道他们及其索引有多少因素。所以,基本上我们所说的是给我一些指数值对应的因子值。
示例演示:
topCountries<-as.factor(c("India", "USA", "UK"))
AllCountries<-as.factor(c("India", "USA", "UK", "China", "Brazil"))
myData<-data.frame(AllCountries)
myData
myData$top<-ifelse(
myData$AllCountries %in% topCountries,
levels(myData$AllCountries)[myData$AllCountries],
"Other"
)
myData
myData中的top
列将为中国和其他人提供“其他”。巴西。对于{India,USA,UK}中Allcountries的行,它将返回各自的值,即{India,USA,UK}。如果不使用levels
,它将返回{India,USA,UK}的“其他”和因子索引值。