数据框如下所示:
id pom.1 pom.2 pom.3 pom.4 pom.5 pom.6 pom.7 pom.8
20764422 1 3 <NA> <NA> <NA> <NA> <NA> <NA>
08049335 4 2 1 5 8 7 9 3
07668511 5 2 7 <NA> <NA> <NA> <NA> <NA>
20058102 7 4 2 <NA> <NA> <NA> <NA> <NA>
17318802 6 3 5 1 9 8 2 <NA>
在此数据框中可以找到10个可能值的列表。
我需要创建另一个数据框,该数据框将具有10列,每个列对应列表中的每个值,并将其与原始数据框进行匹配。
新数据框应如下所示:
id c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
20764422 y n y n n n n n n n
08049335 y y y y y n y y y n
07668511 n y n n y n y n n n
20058102 n y n y n n y n n n
17318802 y y y n y y n y y n
其中每一行(c1-c10)应该与值列表中的一个值匹配。每个id的值“ y”和“ n”表示原始数据帧中存在/不存在某些值。
希望这种解释足以理解需要做的事情。
我试图在发布之前找到答案,但是要么找不到答案,要么搜索不够。无论如何,如果我在这里发布了答案,对不起。
提前致谢!
如果可以使用二进制1和0而不是“ y”和“ n”,则可以尝试以下操作。
如果您提供可重现的(dput
)或数据,这样有助于我们知道您要处理的是数字变量,字符变量还是因子变量,那么它会有所帮助。
library(data.table)
dcast(melt(as.data.table(mydf), "id"), id ~ value)
# Aggregate function missing, defaulting to 'length'
# id 1 2 3 4 5 6 7 8 9 NA
# 1: 7668511 0 1 0 0 1 0 1 0 0 5
# 2: 8049335 1 1 1 1 1 0 1 1 1 0
# 3: 17318802 1 1 1 0 1 1 0 1 1 1
# 4: 20058102 0 1 0 1 0 0 1 0 0 5
# 5: 20764422 1 0 1 0 0 0 0 0 0 6
如果您确实愿意,可以执行以下操作:
dcast(melt(as.data.table(mydf), "id", na.rm = TRUE)[ ## melt and remove NA
, value := factor(value, 1:10)], ## factor value column
id ~ value, ## pivot value by id
fun.aggregate = function(x) ifelse(is.na(x), "n", "y"), ## get your "y" and "n"
fill = "n", drop = FALSE) ## don't drop missing factors
产生:
## id 1 2 3 4 5 6 7 8 9 10
## 1: 07668511 n y n n y n y n n n
## 2: 08049335 y y y y y n y y y n
## 3: 17318802 y y y n y y n y y n
## 4: 20058102 n y n y n n y n n n
## 5: 20764422 y n y n n n n n n n
这是使用tabulate
和的“有趣”答案chartr
:
temp <- `rownames<-`(t(apply(mydf[-1], 1, function(x) tabulate(x, nbins = 10))), mydf[[1]])
temp[] <- chartr("01", "ny", temp)
temp
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# 20764422 "y" "n" "y" "n" "n" "n" "n" "n" "n" "n"
# 08049335 "y" "y" "y" "y" "y" "n" "y" "y" "y" "n"
# 07668511 "n" "y" "n" "n" "y" "n" "y" "n" "n" "n"
# 20058102 "n" "y" "n" "y" "n" "n" "y" "n" "n" "n"
# 17318802 "y" "y" "y" "n" "y" "y" "n" "y" "y" "n"
此答案中使用的示例数据(不一定是您所拥有的):
mydf <- structure(list(id = c("20764422", "08049335", "07668511", "20058102",
"17318802"), pom.1 = c(1L, 4L, 5L, 7L, 6L), pom.2 = c(3L, 2L,
2L, 4L, 3L), pom.3 = c(NA, 1L, 7L, 2L, 5L), pom.4 = c(NA, 5L,
NA, NA, 1L), pom.5 = c(NA, 8L, NA, NA, 9L), pom.6 = c(NA, 7L,
NA, NA, 8L), pom.7 = c(NA, 9L, NA, NA, 2L), pom.8 = c(NA, 3L,
NA, NA, NA)), .Names = c("id", "pom.1", "pom.2", "pom.3", "pom.4",
"pom.5", "pom.6", "pom.7", "pom.8"), row.names = c(NA, 5L), class = "data.frame")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句