当前位置: 首页 > 知识库问答 >
问题:

在data.table中折叠两个不同列中的行?

东郭阳德
2023-03-14

对于虚拟数据集

require(data.table)
require(reshape2)
teamid <- c(1,2,3)
member <- c("a,b","","c,g,h")
leader <- c("c", "d,e", "")
dt <- data.table(teamid, member, leader)

现在数据集看起来像这样:

   teamid member leader
1:      1    a,b      c
2:      2           d,e
3:      3  c,g,h  

3列。对于每个团队,他们在不同的列中有团队成员和团队领导。团队可能只有成员而没有领导者,反之亦然。

以下是我几乎想要的输出:

   teamid value leader
1:      1     a  FALSE
2:      1     b  FALSE
3:      1     c   TRUE
4:      1     c   TRUE
5:      2     d   TRUE
6:      2     e   TRUE
7:      3     c  FALSE
8:      3     g  FALSE
9:      3     h  FALSE

我希望将两列合并成一列,如果其中一列是团队领导,则添加一个标记。

我有一个丑陋的解决方案,

<代码>dt1

问题:

>

  • 我认为,这种解决方案不是有效的,先合并,然后融化。那么,还有其他方法吗?

    在第3行和第4行有重复的行。

    当我试图更改列名时,出现了一个错误

    设置名称(dt 6,值,成员)

    setnames(dt6,value,member)中出错:找不到对象“value”

    也许最重要的是,

    当我尝试在我的真实数据集上进行测试时,这些数据集具有100多万行,3列,发生了以下错误

    如果(允许笛卡尔)为空,则vecseq(f__,len__)中的合并(df1,df2,all=TRUE)错误为。整数(max(nrow(x)):连接结果为238797行;大于142095=最大值(nrow(x),nrow(i))。检查i中是否存在重复的键值,每个键值在x中反复加入同一组。如果没有问题,请尝试包含j并删除by(不包含by),以便j为每个组运行,以避免大的分配。如果确定要继续,请使用allow.cartesian=TRUE重新运行。否则,请在FAQ、Wiki、Stack Overflow和datatable帮助中搜索此错误消息以获取建议。

    有什么建议吗?多谢!

  • 共有3个答案

    太叔何平
    2023-03-14

    你现在可以试试tidyverse解决方案

    dt %>% 
      separate_rows(member) %>% 
      separate_rows(leader) %>% 
      gather(status, member, -teamid) %>% 
      distinct() %>% 
      filter(member != "") %>% 
      mutate(member=ifelse(status == "leader", paste0(member, "*"), member)) %>% 
      select(-status)
      teamid member
    1      1      a
    2      1      b
    3      3      c
    4      3      g
    5      3      h
    6      1     c*
    7      2     d*
    8      2     e*
    
    红富
    2023-03-14

    稍微简单一点的方法可能是

    crew <- dt[, .(strsplit(member, ","))]
    crew <- unlist(crew)
    leads <- dt[, .(strsplit(leader, ","))]
    leads <- unlist(leads)
    
    dt_long <- data.table(people=c(crew, leads), 
        status = rep(c("crew", "leader"), c(length(crew), length(leader))))
    

    它给了我

      people status
    1:      a   crew
    2:      b   crew
    3:      c   crew
    4:      g   crew
    5:      h   crew
    6:      c leader
    7:      d leader
    8:      e leader
    
    阳德润
    2023-03-14

    首先融化。

    result <- melt(dt,id="teamid", variable.name="status", value.name="member")
    result <- result[nchar(member)>0,strsplit(member,","),by=list(teamid,status)]
    setnames(result,"V1","member")
    setkey(result,teamid,status)
    result
    #    teamid status member
    # 1:      1 member      a
    # 2:      1 member      b
    # 3:      1 leader      c
    # 4:      2 leader      d
    # 5:      2 leader      e
    # 6:      3 member      c
    # 7:      3 member      g
    # 8:      3 member      h
    

    如果您想摆脱status列并向成员列添加“标签”,可以这样做:

    result[status=="leader",member:=paste0(member,"*")]
    result[,status:=NULL]
    result
    #    teamid member
    # 1:      1      a
    # 2:      1      b
    # 3:      1     c*
    # 4:      2     d*
    # 5:      2     e*
    # 6:      3      c
    # 7:      3      g
    # 8:      3      h
    
     类似资料:
    • 我有一个关于根据另一个数据表中的信息向数据表中添加列的问题 我的数据是这样的: 数据表 1(足球比赛) 数据表2(足球队收到的卡片): 现在,如果我想基于另一列添加一列,我将在datatable中使用以下函数: 但现在有两个变量需要匹配。球队代码和赛季。这是如何工作的?

    • 我有两个数据。表X和表Y。 列 X: Y 中的值列: 创建两个data.tables: 我设置了 X 和 Y 的键: 现在,我尝试通过X中的< code>id和Y中的< code>ID来连接X和Y: All引发错误,指出参数中的列名无效。 我查阅了data.table的手册,发现< code>merge函数不支持< code>by.x和< code>by.y参数。 如何在不更改列名的情况下通过不同

    • 我希望折叠与给定列的值匹配的数据帧行,但必须使用不同的逻辑折叠其余列。例子: 例如,我希望按城市折叠,我希望ColumnA保持最低值,ColumnB保持平均值。结果应该如下所示: 这只是一个例子,在我的实际问题中,我想应用更复杂的逻辑,而不是min()或mean()。 做这件事的正确、干净和最简单的方法是什么?非常感谢。

    • rbindlist做的正是我需要的,但'do.call'做不到! do.Call不是我想要的

    • 问题内容: 假设我有两个表,表A和表B,并且我想比较某个列。 例如, 表A包含以下列:IP,主机,应用 表B具有以下列:IP,数据中心,服务器,模型,最后更新 如何比较两个表之间的IP列以获取差异? 我知道表是否具有相同的列,我可以使用并集和“减号”来获取差异,但是我无法找出表具有不同列的方式。 谢谢! 问题答案: 这将输出两个表中不匹配行的所有列,并且在任一侧都有NULL。

    • 在你想隐藏部分内容的显示时,可以使用折叠列表。 实例 <ul data-accordion>   <li class="accordion-navigation">     <a href="#demo">Simple Collapsible</a>     <div id="demo">       本站 -- 学的不仅是技术,更是梦想!!!     </div>   </li> </ul> <