我正在处理一个数据框,其中每个观察都链接到一个特定的ID,我有一组变量来定义"值"好像我有一个因子变量。但是,"单元格中的值"是频率。这是一个简化版本:
ID 1 2 3
A 2 3 2
B 1 4 1
我想得到两个扩展频率的向量,以便我可以计算每个ID的插值中位数。也就是说,我喜欢这种形式:
A B
1 1
1 2
2 2
2 2
2 2
3 3
3
psych
包有一个函数interp.median
,然后可以获取每个向量并返回我想要包含的每个ID的插值中值作为原始数据帧中的新变量。我查看了vcdExtra
包可以使用expand.dft
函数执行此操作,但我不确定它是如何工作的。
非常感谢任何帮助!
编辑:要进一步细化,interp.median
如果最终结果是数据帧,最后填充NAs,则效果最佳。也就是说,形式如下:
A B
1 1
1 2
2 2
2 2
2 2
3 3
3 NA
答案 0 :(得分:0)
如果dat
是数据集
lst <- by(dat[,-1], dat[,1], function(x) rep(seq_along(x), x))
lst
#dat[, 1]: A
#[1] 1 1 2 2 2 3 3
#------------------------------------------------------------
#dat[, 1]: B
#[1] 1 2 2 2 2 3
indx <- max(sapply(lst,length))
dat2 <- do.call(data.frame,lapply(lst, function(x) c(x,rep(NA,indx-length(x)))))
dat2
# A B
#1 1 1
#2 1 2
#3 2 2
#4 2 2
#5 2 2
#6 3 3
#7 3 NA
或者
lst2 <- lapply(split(dat[,-1], dat$ID), function(x) rep(seq_along(unlist(x)), unlist(x)))
do.call(data.frame,lapply(lst2, function(x) c(x,rep(NA,indx-length(x)))))
dat <- structure(list(ID = c("A", "B"), `1` = c(2L, 1L), `2` = 3:4,
`3` = c(2L, 1L)), .Names = c("ID", "1", "2", "3"), class = "data.frame", row.names = c(NA,
-2L))
答案 1 :(得分:0)
这里有一种方式:
# your data
df <- data.frame(ID=c(1,2,3), A=c(2,3,2), B=c(1,4,1))
# function to repeat each ID a given number of times,
# as specified in 'colname' of df
rep_id <- function(colname) {
unname(unlist(apply(df[, c('ID',colname)], 1, function(x) rep(x[1], x[2]))))
}
# apply this function to all columns (except the first, which is ID)
sapply(names(df)[-1], rep_id)
收率:
$A
[1] 1 1 2 2 2 3 3
$B
[1] 1 2 2 2 2 3
答案 2 :(得分:0)
示例数据:
df <- read.table(text="
ID 1 2 3
A 2 3 2
B 1 4 1", header=TRUE, check.names=FALSE)
使用apply
:
(newlist <- apply(df[2:4], 1, function(x) rep(names(x), x)))
#[[1]]
#[1] "1" "1" "2" "2" "2" "3" "3"
#
#[[2]]
#[1] "1" "2" "2" "2" "2" "3"
names(newlist) <- df$ID
#$A
#[1] "1" "1" "2" "2" "2" "3" "3"
#
#$B
#[1] "1" "2" "2" "2" "2" "3"
这会输出字符,但您可以输出如下数字:
newlist <- apply(df[2:4], 1, function(x) rep(as.numeric(names(x)), x))
names(newlist) <- df$ID
要解决OP的新请求,即将向量放入data.frame并用NA填充,请在运行上述任一选项后调用此方法:
newlist <- sapply(newlist, function(x) x[1:max(sapply(newlist, length))])
# A B
#[1,] 1 1
#[2,] 1 2
#[3,] 2 2
#[4,] 2 2
#[5,] 2 2
#[6,] 3 3
#[7,] 3 NA