![](/img/trans.png)
[英]Combining two columns in a data frame and creating a new column in an existing data frame in 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.