让我们在R里面有以下数据框:
df <- data.frame(sample=rnorm(1,0,1),params=I(list(list(mean=0,sd=1,dist="Normal"))))
df <- rbind(df,data.frame(sample=rgamma(1,5,5),params=I(list(list(shape=5,rate=5,dist="Gamma")))))
df <- rbind(df,data.frame(sample=rbinom(1,7,0.7),params=I(list(list(size=7,prob=0.7,dist="Binomial")))))
df <- rbind(df,data.frame(sample=rnorm(1,2,3),params=I(list(list(mean=2,sd=3,dist="Normal")))))
df <- rbind(df,data.frame(sample=rt(1,3),params=I(list(list(df=3,dist="Student-T")))))
第一列包含概率分布的随机数,第二列存储带有参数和名称的列表。
数据框df
如下所示:
sample params
1 0.85102972 0, 1, Normal
2 0.67313218 5, 5, Gamma
3 3.00000000 7, 0.7, ....
4 0.08488487 2, 3, Normal
5 0.95025523 3, Student-T
Q1:我如何获得所有记录的名称分配列表? df$params$dist
不起作用。对于单个记录很容易,例如第三个记录:df$params[[3]]$dist
Q2:有没有其他方法可以存储这样的数据?类似于多维数据帧的东西?我不想为每个参数添加列,因为它会将数据帧分散为缺失值。
答案 0 :(得分:2)
将这样的信息存储在纯list
结构中比在数据框中存储更自然:
distList <- list(normal = list(sample=rnorm(1,0,1),params=list(mean=0,sd=1,dist="Normal")),
gamma = list(sample=rgamma(1,5,5),params=list(shape=5,rate=5,dist="Gamma")),
binom = list(sample=rbinom(1,7,0.7),params=list(size=7,prob=0.7,dist="Binomial")),
normal2 = list(sample=rnorm(1,2,3),params=list(mean=2,sd=3,dist="Normal")),
tdist = list(sample=rt(1,3),params=list(df=3,dist="Student-T")))
然后,如果您只想从每个中提取分发名称,我们可以使用sapply
循环遍历列表并提取该片段:
sapply(distList,function(x) x[[2]]$dist)
normal gamma binom normal2 tdist
"Normal" "Gamma" "Binomial" "Normal" "Student-T"
答案 1 :(得分:2)
如果您绝对必须将此信息存储在数据框中,那么可以考虑一种方法。您当前正在数据框中使用params列来存储与分布关联的参数。也许更好的方法是(i)确定任何分发所需的最大参数数量,(ii)将分发名称存储在名为df $ distribution的字段中, (iii)将参数存储在专用参数列中,其含义必须根据分布类型决定。
例如,df $ distribution ='Normal'的任何行都应该有df $ param1 =和df $ param2 =。 df $ distribution ='Student'的行应该有df $ param1 =和df $ param2 = NA。如下所示:
dg <- data.frame(sample=rnorm(1, 0, 1), distribution='Normal',
param1=0, param2=1)
dg <- rbind(dg, data.frame(sample=rgamma(1, 5, 5),
distribution='Gamma', param1=5, param2=5))
dg <- rbind(dg, data.frame(sample=rt(1, 3), distribution='Student',
param1=3, param2=NA))
这很难看,但它会给你你想要的东西。并且不要担心缺失值;在处理非平凡数据帧时,缺失值是生活中的事实。通过适当使用na.rm和complete.cases()等方法,可以在R中轻松处理它们。