在基礎R試圖使用mapply
和match
如下。下面的代碼使用match
來返回帶有NA的向量,其中一列dat2沒有任何變量,並且在dat2中存在匹配的dat1的相應值。對於所需的輸出結構,必須調換dat1 data.frame(data.frame(t(dat1))
)。
# get the vector of unique names in dat2
vars <- unique(unlist(dat2))
mapply(function(x, y, vars) x[match(vars, y)],
data.frame(t(dat1)), dat2, MoreArgs=list(vars=vars))
X1 X2 X3
[1,] 0 NA NA
[2,] 1 1 NA
[3,] 1 NA 1
[4,] NA 0 NA
[5,] NA 0 1
[6,] NA NA 1
返回一個data.frame與命名的變量,在t
把這個包,data.frame
和setNames
。
setNames(data.frame(t(mapply(function(x, y, vars) x[match(vars, y)],
data.frame(t(dat1)), dat2, MoreArgs=list(vars=vars)))), vars)
C2HSD WW11S3 EI22S 2JDDS TT6SQ1 331ID
X1 0 1 1 NA NA NA
X2 NA 1 NA 0 0 NA
X3 NA NA 1 NA 1 1
以下數據將dat2作爲字符向量而不是因子。這是此類操作的首選存儲類型。
數據
dat1 <-
structure(list(item1 = c(0L, 1L, 1L), item2 = c(1L, 0L, 1L),
item3 = c(1L, 0L, 1L)), .Names = c("item1", "item2", "item3"
), class = "data.frame", row.names = c(NA, -3L))
dat2 <-
structure(list(item1 = c("C2HSD", "WW11S3", "EI22S"), item2 = c("WW11S3",
"2JDDS", "TT6SQ1"), item3 = c("EI22S", "TT6SQ1", "331ID")), .Names = c("item1",
"item2", "item3"), class = "data.frame", row.names = c(NA, -3L
))