簡體   English   中英

將數據框中的重復向量分配給R中的條件變量

[英]Assign repeated vector in a dataframe to conditional variables in R

使用以下數據框:

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

如果indiv2==0的長度大於我的向量的長度,我想添加一列V3來分配向量c(1,2,3) ,其中indiv2==0重復進行。 我嘗試了rep函數:

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

我們可以使用data.table來做到這一點。 將'data.frame'轉換為'data.table'( setDT(df) ),然后在'i'中指定邏輯條件( indiv2 == 0 ),我們將length.out作為行數復制1:3 ( .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要求“ yes”和“ no”參數的長度相同。 在這里,我們正在基於rep進行回收,可能效果不佳

您也可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM