[英]Replicate rows by value in column, change values to 1 or 0, in R
我的數據結構為:
A B C D
3 2 1 1
我希望它重組為
A B C D
1 0 0 0
1 0 0 0
1 0 0 0
0 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
關於如何在R中執行此操作有任何想法嗎? 非常感謝。
如果輸入是data.frame,則可以執行以下操作:
coln <- seq_along(df)
m = do.call(rbind, lapply(coln, function(i) {t(replicate(df[1,i], coln == i))})) +0
這將導致如下所示的矩陣:
# [,1] [,2] [,3] [,4]
#[1,] 1 0 0 0
#[2,] 1 0 0 0
#[3,] 1 0 0 0
#[4,] 0 1 0 0
#[5,] 0 1 0 0
#[6,] 0 0 1 0
#[7,] 0 0 0 1
然后,您可以根據需要將其轉換為data.frame或設置列名稱。
這是使用dcast
的選項
library(data.table)
nm1 <- rep(names(df1), unlist(df1))
dcast(data.table(nm1, v1 = seq_along(nm1)), v1 ~ nm1, length)[, v1 := NULL][]
# A B C D
#1: 1 0 0 0
#2: 1 0 0 0
#3: 1 0 0 0
#4: 0 1 0 0
#5: 0 1 0 0
#6: 0 0 1 0
#7: 0 0 0 1
或者在創建'nm1'之后,使用base R
model.matrix
model.matrix(~-1 + nm1)
或一行
model.matrix(~ -1 + rep(names(df1), unlist(df1)))
並更改列名
df1 <- data.frame(A = 3, B = 2, C = 1, D = 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.