【问题标题】:How to recode variable to a categorical type based on list of row numbers如何根据行号列表将变量重新编码为分类类型
【发布时间】:2016-08-04 23:19:42
【问题描述】:

我在尝试在数据框中创建新的分类变量时遇到问题,该变量基于数据框中哪些行应编码为 1 或 0 的预定列表。

我正在尝试在大型数据集 (174020x514) 中执行此操作,但为了概念的可重复性,我将使用 mtcars 数据集。本质上,我有一个包含行号列表的向量x 我想重新编码数据。

df<-mtcars
cat=vector("numeric",length=nrow(df))
df<-cbind(df,cat)
x<-c(1,3,5,8,32)
df$cat[nrow(df)==x]<-1
df$cat[nrow(df)!=x]<-0
df$cat

所以我想要的结果是行号 1、3、5、8 和 32 在新分类列中编码为 1,其余为 0。我在使用 ifelse 语句时也遇到了问题,因为列表x

【问题讨论】:

    标签: r


    【解决方案1】:

    由于您的数据框很大,可能使用data.table

    library(data.table)
    setDT(df)[, cat := 0L][x, cat := 1][, cat := as.factor(cat)]
    

    我们首先创建一个列cat,通过引用等于零。然后,将x 中的所有行赋值为 1。

    如果cat 不需要属于factor 类,只需使用这个:

    setDT(df)[, cat := 0L][x, cat := 1]
    

    【讨论】:

    • 感谢您的回复,我尝试使用 data.table 包,但在将其用于实际的大型数据集时遇到了问题:Error in .data.table(setDT(ed0509)[, :=(SSTI.cat, 0)], SSTI.comb, : i[502] is 175234 which is out of range [1,nrow=174020]. ed0509 是数据框,SSTI.cat 是新的列变量和 SSTI.comb 等价于 x。
    • 代码太多了,我可以告诉你我一直在尝试使用什么...&gt; str(SSTI.comb) num [1:770] 705 1829 2644 3368 3578 ... 是因为我的向量中有值>174020? &gt; length(SSTI.comb) [1] 770setDT(ed0509)[SSTI.comb,SSTI.cat:=1][,SSTI.cat:=0]
    • &gt; tail(SSTI.comb) [1] 508909 509160 511395 515337 516339 520598
    • 我确实收到了一个错误。我意识到我的问题出在我之前的代码上,我使用grep() 生成用于子集的列表,但它返回的行值超出了我正在使用的数据集的值, >174020。我正在努力解决这个问题。
    【解决方案2】:

    我们可以使用dplyr

    library(dplyr)
    library(magrittr)
    df %<>% 
        mutate(cat = +(row_number() %in% x))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      df$cat[(1:32)%in%x]<-1
      df$cat[!(1:32)%in%x]<-0
      df$cat
      
      [1] 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
      

      【讨论】:

        【解决方案4】:

        您可以使用x 来索引您的data.frame,而无需硬编码行数:

        df$cat[x] <- 1
        df$cat[is.na(df$cat)] <- 0
        

        【讨论】:

        • 首先将所有内容分配给 0 然后覆盖一次可能更直接 - df$cat &lt;- 0; df$cat[x] &lt;- 1
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多