Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R变量中的变长向量或列表_R_List_Vector_D3.js_Dataframe - Fatal编程技术网

R变量中的变长向量或列表

R变量中的变长向量或列表,r,list,vector,d3.js,dataframe,R,List,Vector,D3.js,Dataframe,我正在使用R为D3可视化准备一些数据。可视化是使用以下结构创建的(这是.csv文件中的一行,随后在javascript中转换为JSON) 这是一排。标题将是: Person, Email, Location, Communities, Workgroups 您会注意到社区和工作组列包含列表。此外,这些列表的长度将根据每个人与哪些社区和工作组相关而有所不同。我承认这可能不是数据“整洁”的最佳实践,但这正是viz所期望的 所以。。。在R中(我正在学习),我发现不可能重新创建这个结构,因为当我尝试填

我正在使用R为D3可视化准备一些数据。可视化是使用以下结构创建的(这是.csv文件中的一行,随后在javascript中转换为JSON)

这是一排。标题将是:

Person, Email, Location, Communities, Workgroups
您会注意到社区和工作组列包含列表。此外,这些列表的长度将根据每个人与哪些社区和工作组相关而有所不同。我承认这可能不是数据“整洁”的最佳实践,但这正是viz所期望的

所以。。。在R中(我正在学习),我发现不可能重新创建这个结构,因为当我尝试填充“社区”或“工作组”变量时,R似乎期望每个变量的长度相等

我的代码是从一个data.frame读取的,它是特定社区成员的列表,并将该社区的名称添加到所有员工的master data.frame中的一列中。我通过电子邮件地址建立索引,因为它是唯一的。因此,这个特定的循环会在一个名为“commTD”的data.frame中查找每个单独的电子邮件地址,并在一个名为“testr”的master data.frame中找到它。如果找到它,它会查看communities变量,并用社区名称替换NA值(在本例中为“Technical Design”),或者如果向量已经存在,附加技术设计:

for(i in commTD$email){
    if(i %in% testr$email){
        tmpList <- testr[which(testr$email ==i) , 'communities']

        if(is.na(tmpList)){
            tmpList <- list(c("Technical Design"))
        }

        else{        
            tmpList <- append(tmpList[[1]][1], 'Technical Design')
        }

    testr[which(testr$email ==i) , 'communities'] <- list(tmpList)
    }   
} 
for(我在commTD$email中){
如果(i%在%testr$电子邮件中){

tmpList根据定义,数据帧是长度相等的向量列表,因此当您询问是否可以将其作为类Data.frame()时,不可以

您可以按照建议使用另一种类型的对象,如data.table,或者另一种方法是将所需的输出视为不相等向量的列表,以传递给js

该对象看起来类似于:

dataList <- list(name = c("Joe.Schmoe", "Joe.Bloe"),
                 email = c("joe.schmoe@email.com", "joe.bloe@email.com"),
                 location = c("Sao Paulo", "London"),
                 Communities = list(c("Community01", "Community02", "Community03"), 
                                  c("Community02", "Community05", "Community03")
                 ),
                 Workgroups = list(c("workgroup01","workgroup02"), 
                                   c("workgroup01","workgroup03"))
                )
根据Frank的建议,如果您希望通过电子邮件地址访问每个条目,那么您可以如下方式访问每个条目:

data_list[["joe.schmoe@email.com"]]
…然后以电子邮件的名称作为索引构建列表,如下所示:

data_list = list(`joe.schmoe@email.com`=list(name="Joe",
                                             location="Sao Paulo",
                                             Communities=....),
                 `joe.bloe@email.com`=list(n‌​ame="Joe", ...)) 
然后,您可以避免使用for()循环的非R风格,并开始使用lappy()函数家族的乐趣,以矢量化的方式处理所有条目。(有关详细信息,请参阅?lappy)


希望有帮助。

数据表
包支持列表类列。我认为基本R不支持它。而且,听起来你在循环中所做的事情最好通过合并来完成。例如,试试看,
DT谢谢,@Frank。
数据表
与列表
类列一起工作我在摸索。是的,虽然我认为作为一个条目列表会更好,每个人一个……更容易构建。例如,
data\u list=list(`joe)。schmoe@email.com`=列表(name=“Joe”,…),`Joe。bloe@email.com`=list(name=“Joe”)
OP表示数据已“索引”通过电子邮件,这样的安排似乎是合理的,并且允许访问像
数据列表[[”joe。schmoe@email.com“]]
dataList$name
dataList$Communities
etc...
data_list[["joe.schmoe@email.com"]]
data_list = list(`joe.schmoe@email.com`=list(name="Joe",
                                             location="Sao Paulo",
                                             Communities=....),
                 `joe.bloe@email.com`=list(n‌​ame="Joe", ...))