2

使用以下数据框:

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)向量。我尝试了 rep 功能:indiv2==0indiv2==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

但它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
4

2 回答 2

2

我们可以用它data.table来做到这一点。将 'data.frame' 转换为 'data.table' ( setDT(df)),然后在 'i' ( ) 中指定逻辑条件indiv2 == 0,我们将 1:3 复制length.out为行数 ( .N) 并将其分配 ( :=) 给 'V3' ,稍后我们将 NA 元素替换为 0。

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

然后基于“i1”创建“V3”列

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要求“是”和“否”参数的长度相同。在这里,我们正在根据它进行回收rep,它可能无法正常工作

于 2017-04-25T09:06:42.807 回答
1

您也可以使用replace一行来完成。

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

它会发出警告:

警告消息:在 replace(numeric(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
于 2017-04-25T11:41:31.530 回答