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