gpt4 book ai didi

按 id 和变量类型 reshape 数据框

转载 作者:行者123 更新时间:2023-12-01 22:59:37 26 4
gpt4 key购买 nike

我在重新排列以下数据框时遇到问题:

dat1 <- data.frame(
id = rep(1, 4),
var = paste0(rep(c("firstName", "secondName"), each= 2), c(rep(1:2, 2))),
value = c(1:4)
)
dat2 <- data.frame(
id = rep(2,3),
var = paste0(rep(c("firstName", "secondName"), each= 2)[1:3], c(rep(1:2,
2))[1:3]),
value = c(5:7)
)
dat = rbind(dat1, dat2)
dat$type = gsub('[0-9]', '', dat$var)
# > dat
# id var value
# 1 1 firstName1 1
# 2 1 firstName2 2
# 3 1 secondName1 3
# 4 1 secondName2 4
# 5 2 firstName1 5
# 6 2 firstName2 6
# 7 2 secondName1 7

我想得到以下结果:
id firstName  secondName
1 1 3
1 2 4
2 5 7
2 6 NA

我试过 unstack(dat, form = value ~ type)但它不起作用。

问题更新: firstName1应该对应于 secondName1 ,所以如果我将 dat2 更改为
  dat2 <- data.frame(id = rep(2,3),var =paste0(rep(c("firstName", "secondName"), each= 2)[2:4], c(rep(1:2, 2))[2:4]),value = c(5:7))
# > dat
# id var value type
# 1: 1 firstName1 1 firstName
# 2: 1 firstName2 2 firstName
# 3: 1 secondName1 3 secondName
# 4: 1 secondName2 4 secondName
# 5: 2 firstName2 5 firstName
# 6: 2 secondName1 6 secondName
# 7: 2 secondName2 7 secondName

对于 id = 2,他的名字应该是 c(NA, 6) 和 c(5, 7)。那么如何处理这种情况呢?

最佳答案

我认为更好的选择是使用 rowid -功能来自 data.table :

library(data.table)
dcast(setDT(dat), id + rowid(type) ~ type, value.var = 'value')[, type := NULL][]

这使:

   id firstName secondName
1: 1 1 3
2: 1 2 4
3: 2 5 7
4: 2 6 NA


对于更新的问题:
setDT(dat)[, num := gsub('.*([0-9])', '\\1', var)
][, dcast(.SD, id + num ~ type, value.var = 'value')
][, num := NULL][]

这使:

   id firstName secondName
1: 1 1 3
2: 1 2 4
3: 2 NA 6
4: 2 5 7

关于按 id 和变量类型 reshape 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907005/

26 4 0
文章推荐: razor - 如何有条件地禁用标签助手中的