List R中数据帧内的列表列

List R中数据帧内的列表列,list,r,dataframe,List,R,Dataframe,让我们在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

让我们在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")))))
问题1:如何获得所有记录的名称分布列表<代码>df$params$dist不起作用。对于单个记录来说很容易,例如第三条记录:
df$params[[3]]$dist


问题2:有没有其他类似的存储数据的方法?类似多维数据帧的东西?我不想为每个参数添加列,因为它会分散数据帧中缺少的值。

将这样的信息存储在纯
列表
结构中可能比存储在数据帧中更自然:

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(df$params,"[[","dist")
(或
lappy
如果您愿意)可以


我可能至少会将分布的名称放在它们自己的列中,即使您希望参数位于可变长度列表中。

如果您绝对必须将此信息存储在数据帧中,则会想到一种方法。您当前正在数据框中使用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))
dg
sapply(df$params,"[[","dist")
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))