簡體   English   中英

R-當兩列或多列連續匹配時,在數據框中創建新列

[英]R - Creating a new column within a data frame when two or more columns are a match in a row

目前,我只停留在代碼的一部分上,感覺很直觀,但我想不出辦法。 我有一個非常大的數據框(nrows = 34036,ncol = 43),我想在其中創建變量的連續序列,其中行的值為1(多個列的值為1)。 它僅包含零和類似於以下內容的一個:

A B C D
1 0 0 0
0 0 0 1
0 0 0 1
0 0 0 0
0 0 0 0
1 0 1 0
1 0 1 0
0 1 0 0
0 1 0 0
1 0 0 1

我能夠使用以下方式刪除零:

#find the sum of each row
placeholderData <- transform(placeholderData, sum=rowSums(placeholderData)) 
placeholderData <- placeholderData[!(placeholderData$sum <= 0),]

現在數據框看起來像:

A B C D sum
1 0 0 0  1
0 0 0 1  1
0 0 0 1  1
1 0 1 0  2
1 0 1 0  2
0 1 0 0  1
0 1 0 0  1
1 0 0 1  2 

我的主要問題是連續有兩個或多個1。 為了解決這個問題,我使用以下代碼來確定總和為2或更大的列:

placeholderData$Matches <- lapply(apply(placeholderData == 1, 1, which), names)

其中將以下列添加到數據框:

A B C D sum   Matches
1 0 0 0  1      A
0 0 0 1  1      D
0 0 0 1  1      D
1 0 1 0  2  c("A","C")
1 0 1 0  2  c("A","C")
0 1 0 0  1      B
0 1 0 0  1      B
1 0 0 1  2  c("A", "D")

我添加了Matches列作為解決問題的一種方法,但是我不確定如果不使用大量邏輯運算符(我不知道哪些列具有匹配項)怎么辦。 我想做的是將具有大於(或等於)兩個1的行聚合到一個新列中,以便具有這樣的數據框:

A B C D AC AD sum   Matches
1 0 0 0 0  0  1      A
0 0 0 1 0  0  1      D
0 0 0 1 0  0  1      D
0 0 0 0 1  0  1  c("A","C")
0 0 0 0 1  0  1  c("A","C")
0 1 0 0 0  0  1      B
0 1 0 0 0  0  1      B
0 0 0 0 0  1  1  c("A", "D")

然后,我將能夠正常使用我的代碼(當行中沒有重復的值時,它就可以正常工作)。 我嘗試搜索以查找類似的問題,但不確定是否要問正確的問題。 我想知道是否有人可以提供一些幫助或一些我可以嘗試的想法。

非常感謝你!

這似乎很像制作偽變量,所以我將使用通常用於偽變量的model.matrix函數(單次編碼):

m = read.table(header = T, text = "A B C D
1 0 0 0
0 0 0 1
0 0 0 1
0 0 0 0
0 0 0 0
1 0 1 0
1 0 1 0
0 1 0 0
0 1 0 0
1 0 0 1")

m = m[rowSums(m) > 0, ]
d = factor(sapply(apply(m == 1, 1, which), function(x) paste(names(m)[x], collapse = "")))
result = data.frame(model.matrix(~ d + 0))
names(result) = levels(d)
#   A AC AD B D
# 1 1  0  0 0 0
# 2 0  0  0 0 1
# 3 0  0  0 0 1
# 4 0  1  0 0 0
# 5 0  1  0 0 0
# 6 0  0  0 1 0
# 7 0  0  0 1 0
# 8 0  0  1 0 0

暫無
暫無

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

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