R中数据框内的列表列

3

我们在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

问题1: 我如何获得所有记录的名称分布列表?df$params$dist无法工作。对于单个记录很容易,例如第三个:df$params[[3]]$dist

问题2:是否有其他存储数据的方式,类似于多维数据帧?我不想为每个参数添加列,因为它会在数据帧中散布缺失值。

3个回答

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" 

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))

虽然不太美观,但它能给你想要的结果。而且不用担心缺失值;在处理非平凡数据框时,缺失值是不可避免的事实。在R中,可以通过适当使用na.rm和complete.cases()等工具轻松处理它们。


1

根据你手头的数据框,

sapply(df$params,"[[","dist")

(或者如果您喜欢,可以使用lapply)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接