0

我有一个看起来像这样的数据框:

df <- data.frame(A=c("a","b","c","d","e","f","g","h","i"), 
           B=c("1","1","1","2","2","2","3","3","3"), 
           C=c(0.1,0.2,0.4,0.1,0.5,0.7,0.1,0.2,0.5))

> df
  A B   C 
1 a 1 0.1 
2 b 1 0.2 
3 c 1 0.4 
4 d 2 0.1 
5 e 2 0.5 
6 f 2 0.7 
7 g 3 0.1 
8 h 3 0.2 
9 i 3 0.5

还有一个列表,其中包含名称与 匹配的元素df$B,即这些值是来自 的值的排列df$B,这是一个示例:

 ll <- list('1'=c(0.1,0.1,0.4,0.2,0.1,0.4),
            '2'=c(0.1,0.1,0.5,0.7,0.5,0.7),
            '3'=c(0.1,0.1,0.2,0.2,0.2,0.5))

有没有办法在数据框中创建与列表中的值相对应的新列,但df同时它们是来自的采样值?这是一个更好的解释所需的输出df$Bllll

> df
  A B   C  P1  P2  P3  P4  P5  P6
1 a 1 0.1 0.1 0.1 0.4 0.2 0.1 0.4
2 b 1 0.2 0.1 0.4 0.2 0.1 0.2 0.2
3 c 1 0.4 0.4 0.1 0.2 0.1 0.1 0.4
4 d 2 0.1 0.1 0.7 0.5 0.1 0.7 0.1
5 e 2 0.5 0.7 0.5 0.1 0.7 0.1 0.5
6 f 2 0.7 0.5 0.5 0.7 0.1 0.7 0.1
7 g 3 0.1 0.1 0.1 0.2 0.2 0.2 0.5
8 h 3 0.2 0.2 0.1 0.5 0.2 0.2 0.5
9 i 3 0.5 0.1 0.2 0.1 0.1 0.5 0.2 
4

1 回答 1

1

可能像这样:

cbind(df, t(sapply(df$B, function(i, l) sample(l[[as.character(i)]]), l = ll))

#   A B   C   1   2   3   4   5   6
# 1 a 1 0.1 0.2 0.4 0.1 0.1 0.4 0.1
# 2 b 1 0.2 0.4 0.2 0.4 0.1 0.1 0.1
# 3 c 1 0.4 0.4 0.1 0.2 0.1 0.1 0.4
# 4 d 2 0.1 0.1 0.7 0.5 0.5 0.1 0.7
# 5 e 2 0.5 0.7 0.1 0.5 0.1 0.5 0.7
# 6 f 2 0.7 0.5 0.1 0.7 0.1 0.5 0.7
# 7 g 3 0.1 0.5 0.1 0.2 0.1 0.2 0.2
# 8 h 3 0.2 0.2 0.2 0.1 0.5 0.2 0.1
# 9 i 3 0.5 0.1 0.2 0.1 0.5 0.2 0.2

或者,如果我误解了,请澄清“置换”。

于 2013-06-24T23:45:03.433 回答