2017-11-25 71 views
2

我有包含两组数据观测一个数据帧(A,B),与由列名称给定的数据集和观测类型:R:从广角重塑数据帧基于化合物列名长格式

mydf <- data.frame(meta1=paste0("a",1:2), meta2=paste0("b",1:2), 
        A_var1 = c(11:12), A_var2 = c("p","r"), 
        B_var1 = c(21:22), B_var2 = c("x","z")) 

我想重新设计此数据框,以便每行仅包含一组观察值。在这漫长的格式,设置和列名应通过在“_”分裂原始列名给出:

mydf2 <- data.frame(meta1=rep(paste0("a",1:2),2), 
        meta2=rep(paste0("b",1:2),2), 
        set=c("A","B","A","B"), 
        var1 = c(11:12), 
        var2 = c("a","b","c","d")) 

我一直在使用与“str_split”,“子”组合“收集”尝试,但很遗憾没有成功。这可以通过使用潮流函数来完成吗?

回答

1

是的,你可以用tidyverse做到这一点!

您已经关闭,您需要gather,然后separate,然后spread

new_df <- mydf %>% 
    gather(set, vars, 3:6) %>% 
    separate(set, into = c('set', 'var'), sep = "_") %>% 
    spread(var, vars) 

希望这有助于!

+0

谢谢!奇迹般有效。但是,它确实会生成两条警告消息: 1:各个度量变量的属性不相同;他们将被丢弃 2:使用...将参数传递给'strsplit()'已失效。任何方式来避免这些被生成? –

+0

很高兴帮助。所以我得到了同样的错误。第一个是因为你的A_var1,A_var2等列都是因子和数字。它强制它们变成字符,因为它不能混合它们。您可以通过首先将这些列更改为“字符”来避免这种情况。但没关系。我意识到的第二个错误是因为我使用'by =',而不是'sep =',在'separate'中。我刚刚编辑过,即使他们都工作。 'sep ='是正确的。 如果您接受答案,请勾选复选框,如果您愿意的话!谢谢。 –

+0

谢谢。将第二个短语更改为'gather(set,vars,contains(“_”))'使得解决方案更加通用。 –