R:ifelse函数返回向量位置而不是值(字符串)

时间:2014-02-06 13:35:25

标签: r if-statement

关于ifelse函数,我有一个非常奇怪的问题:它不会返回一个因子(正如我想的那样),而是类似于因子的位置。

我使用的数据集可以下载here

我想要什么

..是在df中创建一个新列,其中包含国家/地区的名称,如果该国家/地区属于前12个最常见的国家/地区(在“答案”列中)。否则它应该包含“其他”

我做了什么

...是

  • 使用as.data.frame(摘要..等)创建一个包含最常用国家/地区名称的列表##此作品
  • 该函数的TRUE部分使用%in%##将df $ col值与此列表匹配
  • 如果TRUE应该是该
  • 中的因子(国家/地区名称),则返回值

然而

... 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的后续问题,因为它有些不同,可能需要单独提问。

3 个答案:

答案 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}的“其他”和因子索引值。