R 展开以变量名为值的频率表

R 展开以变量名为值的频率表,r,frequency,median,psych,R,Frequency,Median,Psych,我正在使用一个数据框架,其中每个观察值都链接到一个特定的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 A B 1 1 1 2 2 2 2 2 2 2 3 3 3 NA ps

我正在使用一个数据框架,其中每个观察值都链接到一个特定的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
A  B
1  1
1  2
2  2
2  2
2  2
3  3
3  NA
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
A  B
1  1
1  2
2  2
2  2
2  2
3  3
3  NA

如果
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
lst这里有一种方法:

# 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)
样本数据:

df <- read.table(text="
ID  1  2  3
A   2  3  2
B   1  4  1", header=TRUE, check.names=FALSE)
这将输出字符,但您可以像这样输出数字:

newlist <- apply(df[2:4], 1, function(x) rep(as.numeric(names(x)), x))
names(newlist) <- df$ID

newlist我认为第二个步骤是可行的,只要我可以在列表的最后用NAs填充每个元素,使所有内容都具有相同的长度,以便转换为数据帧。关于如何做到这一点的建议?太好了!我用更多的样本数据集进行了测试。我认为这将很好地发挥作用。
(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
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