【发布时间】:2018-01-04 17:51:11
【问题描述】:
我使用 R 生成玩具套装
data.frame(name = c("Tom", "Shane", "Daniel", "Akira", "Jack", "Zoe"), c1 = c(1,2,3,0,5,0), c2 = c(0, 3, 5, 0,4,0), c3 = c(0, 0,1,0,0,3), c4=c(0,0,0,1,0,0))
如下所示:
我只关心列c1, c2, c3, c4,如果特定行有多个值,大于0。我们需要复制行以确保只有一个值,大于0 ,然后删除原始行。
比如第二行有两个值都大于0(c1:2,c2:3),那么我们就要把那行复制成两个,如下所示
Shane 2 0 0 0
Shane 0 3 0 0
我正在尝试构建一个 SQL 查询来捕获这一点。但是,我不确定是否有任何 SQL 函数可以在不先查看结果的情况下检测特定行中的多个非零值。无论如何,如果存在任何神奇的 SQL 函数,最终结果应该是这样的:
我也想用 R 来完成它。我知道的唯一可以复制行的 R 函数是 do.call() 函数,然后将它与 rbind() 函数结合使用。但是,它不适用于我的情况。你能给我任何提示吗?非常感谢:)
【问题讨论】:
-
请在发布数据时发布实际数据(例如,使用
dput)而不是其图像。我无法突出显示此图像并粘贴到我的 R 会话中以尝试使用某些东西来帮助您。我还没有无聊到将你所有的数据转录成一个示例 data.frame 来播放。我建议你阅读reproducible questions 以获得更多关于如何做好这件事的指导,让我们其他人更容易。谢谢! -
@r2evans:很抱歉。这是生成玩具套装的 R 代码:` data.frame(name = c("Tom", "Shane", "Daniel", "Akira", "Jack", "Zoe"), c1 = c(1 ,2,3,0,5,0), c2 = c(0, 3, 5, 0,4,0), c3 = c(0, 0,1,0,0,3), c4=c( 0,0,0,1,0,0))`
-
请不要在 cmets 中发布代码。编辑问题,看起来会好很多。