如何根据行号列表将变量重新编码为分类类型

时间:2016-08-04 23:19:43

标签: r

我在尝试在数据框架中创建新的分类变量时遇到问题,该数据框架基于预先确定的数据框中哪些行应编码为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

4 个答案:

答案 0 :(得分:2)

由于您的数据框很大,可以使用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]

答案 1 :(得分:1)

我们可以使用dplyr

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

您可以使用for ($x=strtotime('2015-12-01');$x<=strtotime('2015-12-30');$x+=86400) echo date('Y-m-d',$x); 索引data.frame,而无需对行数进行硬编码:

x