对于虚拟数据集
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帮助中搜索此错误消息以获取建议。
有什么建议吗?多谢!
你现在可以试试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*
稍微简单一点的方法可能是
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
首先融化。
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> <