我有一个数据框架,看起来像这样:
ID V1 V2 V3 V4 V5
1 a 6 3 5 3
2 c 4 1 2 1
3 g 8 2 4 2
4 h 7 9 8 1
5 a 4 6 2 1
6 b 4 2 1 2
7 j 8 7 1 4
我需要创建一个新的虚拟变量,并将其添加到这个数据框架作为列"V6"我需要根据外部电子表格中的矩阵来做,例如:
V1 1 2 3 4 5 6 7 8 9
a 1 1 1 1 1
b 1 1 1 1 1 1 1
c 1
d 1 1 1 1 1 1 1 1 1
g 1 1
h 1 1
i 1 1 1
j
k 1 1 1 1 1
在上述矩阵中,V1列为原数据框中V1变量的值,其他列对应V5变量的可能值。电子表格中所有的空格都是空的。我需要一个新的虚拟变量,V6来表示1如果单位是基于值的交集的矩阵上的1。因此,结果如下:
ID V1 V2 V3 V4 V5 V6
1 a 6 3 5 3 0
2 c 4 1 2 1 0
3 g 8 2 4 2 1
4 h 7 9 8 1 0
5 a 4 6 2 1 1
6 b 4 2 1 2 0
7 j 8 7 1 4 0
对于V6变量,ID 1是一个0,因为在矩阵中,a和值3相交于一个空白(或0),因此第1行的虚拟变量是一个0,因为它的V1是a,它的V5是3。相反,第三行生成1,因为它的V1是G,它的V5值是2。矩阵上的交集g-2是1,因此该组合的V6是"命中",或者是虚拟变量
中的1。我认识到这是虚拟变量创建的一种奇怪的方法,但是如何使用外部创建的电子表格这样的基于最有效的交叉值创建虚拟变量?什么是一种灵活的编码方式,以便它可以根据变量是字符还是数字进行调整?
我认为最好的方法是通过旋转/重塑df2
(1
s和空白),并将其加入df1
(原始数据)。
注意:您的df2
是否有空字符串或NA
值并不十分清楚。如果是后者,则将nzchar(V6)
替换为!is.na(V6)
或!V6 %in% c(NA, "")
(对于两种可能性)。
out <- reshape2::melt(df2, "V1", variable.name = "V5", value.name = "V6") |>
subset(nzchar(V6)) |>
merge(df1, by = c("V1", "V5"), all.y = TRUE) |>
transform(V6 = +(!is.na(V6)))
out
# V1 V5 V6 ID V2 V3 V4
# 1 a 1 1 5 4 6 2
# 2 a 3 0 1 6 3 5
# 3 b 2 0 6 4 2 1
# 4 c 1 0 2 4 1 2
# 5 g 2 1 3 8 2 4
# 6 h 1 0 4 7 9 8
# 7 j 4 0 7 8 7 1
行/列乱了,我们可以很容易地恢复它:
out <- out[order(out$ID), c("ID", sort(setdiff(names(out), "ID")))]
out
# ID V1 V2 V3 V4 V5 V6
# 2 1 a 6 3 5 3 0
# 4 2 c 4 1 2 1 0
# 5 3 g 8 2 4 2 1
# 6 4 h 7 9 8 1 0
# 1 5 a 4 6 2 1 1
# 3 6 b 4 2 1 2 0
# 7 7 j 8 7 1 4 0
<标题>dplyr/tidyr h1>
数据df1 <- structure(list(ID = 1:7, V1 = c("a", "c", "g", "h", "a", "b", "j"), V2 = c(6L, 4L, 8L, 7L, 4L, 4L, 8L), V3 = c(3L, 1L, 2L, 9L, 6L, 2L, 7L), V4 = c(5L, 2L, 4L, 8L, 2L, 1L, 1L), V5 = c(3L, 1L, 2L, 1L, 1L, 2L, 4L)), class = "data.frame", row.names = c(NA, -7L))
df2 <- structure(list(V1 = c("a", "b", "c", "d", "g", "h", "i", "j", "k"), "1" = c("1", "1", "", "1", "1", "", "", "", "1"), "2" = c("1", "", "", "1", "1", "1", "", "", "1"), "3" = c("", "", "", "1", "", "", "", "", "1"), "4" = c("1", "1", "", "1", "", "", "", "", "1"), "5" = c("1", "1", "", "1", "", "", "1", "", "1"), "6" = c("1", "1", "", "1", "", "", "1", "", ""), "7" = c("", "1", "", "1", "", "", "", "", ""), "8" = c("", "1", "", "1", "", "", "", "", ""), "9" = c("", "1", "1", "1", "", "1", "1", "", "")), row.names = c(NA, -9L), class = "data.frame")
标题>标题>