如何在R中将数据从一行分离为两行?

如何在R中将数据从一行分离为两行?,r,split,R,Split,对于在名为“Submit.and.module”的列中值为“Separate”的行,我希望在其正上方插入一行,并将数据从某些列移动到新行 具体来说,我想将名为“Submit.help”和“Strategy”的列中的数据移到上面的新行 现在我的数据如下所示: 我希望数据如下所示: 如何做到这一点?方法是将要复制的列剪切到单独的数据表中,将其添加到原始数据中(在末尾),并使用名为“sort”的辅助列按正确顺序对行进行排序: 库(data.table) 数据代码很难看,但如果您需要,我会尝试解释它

对于在名为“Submit.and.module”的列中值为“Separate”的行,我希望在其正上方插入一行,并将数据从某些列移动到新行

具体来说,我想将名为“Submit.help”和“Strategy”的列中的数据移到上面的新行

现在我的数据如下所示:

我希望数据如下所示:


如何做到这一点?

方法是将要复制的列剪切到单独的数据表中,将其添加到原始数据中(在末尾),并使用名为“sort”的辅助列按正确顺序对行进行排序:

库(data.table)

数据代码很难看,但如果您需要,我会尝试解释它的作用(如果我早上记得的话)。当然,还有另一种优雅的方式可以做到这一点。但为了庆祝多样性

您的示例数据集:
下面是另一个data.table解决方案(似乎我太慢了):

库(data.table)

DT我想我会用另一个解决方案加入党

数据

data <- data.frame(Which.mod         = c("TMH", "TMH-C", "TMH", "FC", "FC"),
                   Mod.time          = c(1.43, 2.31, 0.67, 2.35, 8.22),
                   Submit.help       = c(NA, "Help", NA, NA, "Submit"),
                   Strategy          = c(NA, "Ratio", NA, NA, "Count"),
                   Submit.and.module = c(NA, "Separate", NA, NA, "Separate"))
df1 <- data.frame(
  Which.mod = c("TMH", "TMH-C", "TMH", "FC", "FC"),
  Mod.time = c(1.43, 2.31, 0.67, 2.35, 8.22),
  Submit.help = c(NA, "Help", NA, NA, "Submit"),
  Strategy = c(NA, "Ratio", NA, NA, "Count"),
  Submit.and.module = c(NA, "Separate", NA, NA, "Separate"),
  stringsAsFactors = FALSE
)

data这里有一个
tidyverse
解决方案:

library(tidyverse)
nms <- names(df1)
df1 %>% 
  rowid_to_column %>%
  gather(,,-rowid) %>% 
  filter(!is.na(value)) %>%
  mutate(tmp = key %in% c("Which.mod","Mod.time","Submit.and.module")) %>%
  spread(key,value) %>%
  select_at(nms)

#   Which.mod Mod.time Submit.help Strategy Submit.and.module
# 1       TMH     1.43        <NA>     <NA>              <NA>
# 2      <NA>     <NA>        Help    Ratio              <NA>
# 3     TMH-C     2.31        <NA>     <NA>          Separate
# 4       TMH     0.67        <NA>     <NA>              <NA>
# 5        FC     2.35        <NA>     <NA>              <NA>
# 6      <NA>     <NA>      Submit    Count              <NA>
# 7        FC     8.22        <NA>     <NA>          Separate
库(tidyverse)
nms%
rowid_到_列%>%
聚集(,-rowid)%
过滤器(!is.na(值))%>%
变异(tmp=%c中的键%(“Which.mod”、“mod.time”、“Submit.and.module”))%>%
排列(键,值)%>%
在(nms)上选择_
#Which.mod.time Submit.help Strategy Submit.and.module
#1 TMH 1.43
#2帮助比率
#3 TMH-C 2.31独立
#4 TMH 0.67
#5 FC 2.35
#6提交计数
#7 FC 8.22单独的
数据

data <- data.frame(Which.mod         = c("TMH", "TMH-C", "TMH", "FC", "FC"),
                   Mod.time          = c(1.43, 2.31, 0.67, 2.35, 8.22),
                   Submit.help       = c(NA, "Help", NA, NA, "Submit"),
                   Strategy          = c(NA, "Ratio", NA, NA, "Count"),
                   Submit.and.module = c(NA, "Separate", NA, NA, "Separate"))
df1 <- data.frame(
  Which.mod = c("TMH", "TMH-C", "TMH", "FC", "FC"),
  Mod.time = c(1.43, 2.31, 0.67, 2.35, 8.22),
  Submit.help = c(NA, "Help", NA, NA, "Submit"),
  Strategy = c(NA, "Ratio", NA, NA, "Count"),
  Submit.and.module = c(NA, "Separate", NA, NA, "Separate"),
  stringsAsFactors = FALSE
)

df1您能否以
dput
格式发布样本数据和预期输出?请使用
dput(df)
的输出编辑问题。或者,如果dput(头部(df,20))的输出太大
。(
df
是数据集的名称。)欢迎来到SO!请补充你为什么要这样做(也许有更好的方法来实现你的需求)。对不起,我不知道如何用dput格式来做。我的实际数据集要复杂得多,所以我在Excel中创建了一个示例。我之所以要这样做,是因为这是按时间顺序记录的日志数据,可以捕获用户在教程系统中的操作。日志中有一个缺陷,应该在两行中捕获的内容会定期合并到一行中。我需要将它们分开,因为Submit.help操作实际上发生在Submit.modSteps之前。将工作表另存为CSV文件,在R中使用
xread.CSV
read.csv2
将文件读入变量,然后通过
dput(变量名称)将变量内容“转储”到R控制台上的文本格式中
您可以在此处发布此输出…如果您在excel中有数据,并且正在使用Rstudio,您可能需要查看库()以从中创建一个
数据框。
。疯狂的代码,但它可以工作:-)刚才看到我的回答忽略了上一列的过滤器。。。我将更新基于
数据表的替代方案
是的,这是真的……奇怪的事情-我觉得我还不明白:)我最喜欢的是
设置顺序
na.last
相结合。干得好:-)谢谢!又好又简单。因此,当您创建dat2时,在过滤之前进行变异。我不知道你可以这样组合函数。这是最好的聚会,我去过(c)@HelenaConnolly是的,
tidyverse
的美妙之处在于使用管道可以使代码更容易阅读,还可以省去中间变量。
library(data.table)

DT <- data.table(stringsAsFactors=FALSE,
               Index = seq(5),
           Which.mod = c("TMH", "TMH-C", "TMH", "FC", "FC"),
            Mod.time = c(1.43, 2.31, 0.67, 2.35, 8.22),
         Submit.help = c(NA, "Help", NA, NA, "Submit"),
            Strategy = c(NA, "Ratio", NA, NA, "Count"),
   Submit.and.module = c(NA, "Separate", NA, NA, "Separate")
)

DT <- rbindlist(list(DT, DT[Submit.and.module %in% "Separate", c("Index", "Submit.help", "Strategy")]), use.names=TRUE, fill=TRUE)
DT[Submit.and.module %in% "Separate", c("Submit.help", "Strategy") := NA]
setorder(DT, Index, Mod.time, na.last=FALSE)
print(DT)
data <- data.frame(Which.mod         = c("TMH", "TMH-C", "TMH", "FC", "FC"),
                   Mod.time          = c(1.43, 2.31, 0.67, 2.35, 8.22),
                   Submit.help       = c(NA, "Help", NA, NA, "Submit"),
                   Strategy          = c(NA, "Ratio", NA, NA, "Count"),
                   Submit.and.module = c(NA, "Separate", NA, NA, "Separate"))
data$id <- 1:nrow(data)
data1 <- subset(data, !is.na(Submit.and.module))
data[, c("Submit.help", "Strategy")] <- NA
data1[, c("Which.mod", "Mod.time", "Submit.and.module")] <- NA
final <- rbind(data1, data)
final.ordered <- df1[order(df1$id), ]

#    Which.mod Mod.time Submit.help Strategy Submit.and.module id
# 1        TMH     1.43        <NA>     <NA>              <NA>  1
# 2       <NA>       NA        Help    Ratio              <NA>  2
# 21     TMH-C     2.31        <NA>     <NA>          Separate  2
# 3        TMH     0.67        <NA>     <NA>              <NA>  3
# 4         FC     2.35        <NA>     <NA>              <NA>  4
# 5       <NA>       NA      Submit    Count              <NA>  5
# 51        FC     8.22        <NA>     <NA>          Separate  5
library(tidyverse)
dat1 <- data %>% mutate(id = 1:n(), Submit.help = NA, Strategy = NA)
dat2 <- data %>% mutate(id = 1:n()) %>% 
                 filter(!is.na(Submit.and.module)) %>%
                 mutate(Which.mod = NA, Mod.time = NA, Submit.and.module = NA)
final <- rbind(dat2, dat1) %>% arrange(id)
library(tidyverse)
nms <- names(df1)
df1 %>% 
  rowid_to_column %>%
  gather(,,-rowid) %>% 
  filter(!is.na(value)) %>%
  mutate(tmp = key %in% c("Which.mod","Mod.time","Submit.and.module")) %>%
  spread(key,value) %>%
  select_at(nms)

#   Which.mod Mod.time Submit.help Strategy Submit.and.module
# 1       TMH     1.43        <NA>     <NA>              <NA>
# 2      <NA>     <NA>        Help    Ratio              <NA>
# 3     TMH-C     2.31        <NA>     <NA>          Separate
# 4       TMH     0.67        <NA>     <NA>              <NA>
# 5        FC     2.35        <NA>     <NA>              <NA>
# 6      <NA>     <NA>      Submit    Count              <NA>
# 7        FC     8.22        <NA>     <NA>          Separate
df1 <- data.frame(
  Which.mod = c("TMH", "TMH-C", "TMH", "FC", "FC"),
  Mod.time = c(1.43, 2.31, 0.67, 2.35, 8.22),
  Submit.help = c(NA, "Help", NA, NA, "Submit"),
  Strategy = c(NA, "Ratio", NA, NA, "Count"),
  Submit.and.module = c(NA, "Separate", NA, NA, "Separate"),
  stringsAsFactors = FALSE
)