R 基于列表中的值向数据框添加列

R 基于列表中的值向数据框添加列,r,R,我有一个如下所示的数据帧: 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

我有一个如下所示的数据帧:

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
中创建与列表
ll
df$B
的值相对应的新列,但同时它们是
ll
中的采样值? 下面是一个更好的解释所需的输出

> 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 
也许像这样:

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

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

您的意思必须是采样值,而不是“置换值”?排列改变了向量的顺序,但没有改变成员身份。谢谢@Dwin,我会改变它。谢谢@flodel,
l[[as.character(I)]
的值将在
df$b
的值和
ll
的名称之间匹配,不是吗?谢谢,这就是我想要的,
apply
函数非常有用。再次感谢@flodel您是否应该将
replace=TRUE
添加到
sample
调用中?请注意,在期望的结果中,采样的
ll
组件的频率并不总是与原始频率匹配。@最近的邮件可能是。在这种情况下,我不会像德温指出的那样称之为排列。不确定OP的措辞是否错误或其预期输出。实际上,我希望匹配
df$B
值的每一行对应于
ll
的随机排列,是的,我希望原始频率非常相同,我是否应该将
replace=TRUE
添加到
sample
调用中?
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