将数据帧中的重复向量分配给R中的条件变量

时间:2017-04-25 09:04:27

标签: r vector dataframe rep

使用以下数据框:

indiv1 <- c('ID1','ID45','ID85','ID41','ID70','ID32','ID21','ID26')
indiv2 <- c('ID12',0,'ID3',0,'ID10','ID8',0,0)
df <- data.frame(indiv1,indiv2)

> df
  indiv1 indiv2
1    ID1   ID12
2   ID45      0
3   ID85    ID3
4   ID41      0
5   ID70   ID10
6   ID32    ID8
7   ID21      0
8   ID26      0

如果V3的长度大于我的向量的长度,我想添加一个列c(1,2,3)来指定向量indiv2==0,其中indiv2==0重复df$V3 <- ifelse(df$indiv2==0,rep(1:3,length.out=dim(df[df$indiv2==0,])[1]),0) > df indiv1 indiv2 V3 1 ID1 ID12 0 2 ID45 0 2 3 ID85 ID3 0 4 ID41 0 1 5 ID70 ID10 0 6 ID32 ID8 0 7 ID21 0 3 8 ID26 0 1 。 我尝试了rep函数:

indiv2!=0

但它会计算> df indiv1 indiv2 V3 1 ID1 ID12 0 2 ID45 0 1 3 ID85 ID3 0 4 ID41 0 2 5 ID70 ID10 0 6 ID32 ID8 0 7 ID21 0 3 8 ID26 0 1 在哪里继续向量的行:

{{1}}

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table来执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),然后在&#39; i&#39;中指定逻辑条件。 (indiv2 == 0),我们将length.out作为行数(.N)复制1:3,并将其分配(:=)到&#39; V3&#39; ,稍后我们用0替换NA元素。

library(data.table)
setDT(df)[indiv2==0, V3 := rep(1:3, length.out= .N)][is.na(V3), V3 := 0]
df
#   indiv1 indiv2 V3
#1:    ID1   ID12  0
#2:   ID45      0  1
#3:   ID85    ID3  0
#4:   ID41      0  2
#5:   ID70   ID10  0
#6:   ID32    ID8  0
#7:   ID21      0  3
#8:   ID26      0  1

如果我们使用base R,请创建逻辑向量

i1 <- df$indiv2 == 0

然后创建&#39; V3&#39;列基于&#39; i1&#39;

df$V3[i1] <- rep(1:3, length.out = sum(i1))

并将NA替换为0

df$V3[is.na(df$V3)] <- 0

df$V3
#[1] 0 1 0 2 0 0 3 1

使用ifelse需要长度为“是”&#39;并且没有&#39;参数是一样的。在这里,我们正在根据rep进行回收,但可能效果不佳

答案 1 :(得分:1)

您也可以使用replace在一行中执行此操作。

df$v3 <- replace(numeric(nrow(df)), df$indiv2 == 0, 1:3)

它会发出警告:

  

警告讯息:   在替换(数字(nrow(df)),df $ indiv2 == 0,1:3):
    要替换的项目数量不是替换长度的倍数

但产生了预期的结果。

df
  indiv1 indiv2 v3
1    ID1   ID12  0
2   ID45      0  1
3   ID85    ID3  0
4   ID41      0  2
5   ID70   ID10  0
6   ID32    ID8  0
7   ID21      0  3
8   ID26      0  1