如何创建一行,将R中以前行的某些值组合在一起?

如何创建一行,将R中以前行的某些值组合在一起?,r,dataframe,R,Dataframe,在我的数据中,有几行代表了重复测试的结果。重复中仅捕获某些值。我想做的是用repeat值创建一个新行,但如果repeat值为NA或空白,则从初始测试中提取 例如 Patient ID Initial/Repeat Value Value 2 Accept/Reject A1 Initial 95 NA Reject A1 Repeat NA

在我的数据中,有几行代表了重复测试的结果。重复中仅捕获某些值。我想做的是用repeat值创建一个新行,但如果repeat值为NA或空白,则从初始测试中提取

例如

Patient ID   Initial/Repeat   Value    Value 2   Accept/Reject
A1                   Initial      95        NA          Reject
A1                    Repeat      NA        80          Accept    
A2                   Initial      80        70          Accept
我想转换成:

Patient ID   Initial/Repeat   Value    Value 2   Accept/Reject
A1                    Repeat      95        80          Accept    
A2                   Initial      80        70          Accept

谢谢。

是否始终是一系列具有单个有效值的NA?如果是的话,你可以取行数的平均值,扔掉所有的NA。我使用dplyr的分组和总结功能来实现这一点:

# Sample data:
df = read.table(text="PatientID   Initial_Repeat   Value    Value2   Accept_Reject
A1                   Initial      95        NA          Reject
A1                    Repeat      NA        80          Accept    
A2                   Initial      80        70          Accept", header = TRUE)

# My solution uses the dplyr package:
library(dplyr)
answer = df %>% 
     group_by(PatientID) %>% 
     summarise(Value = mean(Value, na.rm = TRUE), Value2 = mean(Value2, na.rm = TRUE))
答复:

# A tibble: 2 x 3
  PatientID Value Value2
     <fctr> <dbl>  <dbl>
1        A1    95     80
2        A2    80     70
#一个tible:2x3
PatientID值2
1 A1 95 80
2 A2 80 70


它总是一系列NA,且只有一个有效值吗?如果是的话,你可以取行数的平均值,扔掉所有的NA。我使用dplyr的分组和总结功能来实现这一点:

# Sample data:
df = read.table(text="PatientID   Initial_Repeat   Value    Value2   Accept_Reject
A1                   Initial      95        NA          Reject
A1                    Repeat      NA        80          Accept    
A2                   Initial      80        70          Accept", header = TRUE)

# My solution uses the dplyr package:
library(dplyr)
answer = df %>% 
     group_by(PatientID) %>% 
     summarise(Value = mean(Value, na.rm = TRUE), Value2 = mean(Value2, na.rm = TRUE))
答复:

# A tibble: 2 x 3
  PatientID Value Value2
     <fctr> <dbl>  <dbl>
1        A1    95     80
2        A2    80     70
#一个tible:2x3
PatientID值2
1 A1 95 80
2 A2 80 70

试试这个:

require(zoo)
require(dplyr)

df %>%
  group_by(Patient_ID) %>%
  mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE))) %>% 
  filter(row_number()==n())
输出:

# A tibble: 2 x 5
# Groups:   Patient_ID [2]
  Patient_ID Initial_Repeat Value Value2 Accept_Reject
       <chr>          <chr> <int>  <int>         <chr>
1         A1         Repeat    95     80        Accept
2         A2        Initial    80     70        Accept
   PatientID Inital_Repeat Value Value2 Accept_Reject
A1         1        Repeat    95     80        Accept
A2         2       Initial    80     70        Accept
#一个tible:2 x 5
#分组:患者编号[2]
患者ID初始值\u重复值2接受\u拒绝
1 A1重复95 80接受
2 A2首字母80 70接受
试试这个:

require(zoo)
require(dplyr)

df %>%
  group_by(Patient_ID) %>%
  mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE))) %>% 
  filter(row_number()==n())
输出:

# A tibble: 2 x 5
# Groups:   Patient_ID [2]
  Patient_ID Initial_Repeat Value Value2 Accept_Reject
       <chr>          <chr> <int>  <int>         <chr>
1         A1         Repeat    95     80        Accept
2         A2        Initial    80     70        Accept
   PatientID Inital_Repeat Value Value2 Accept_Reject
A1         1        Repeat    95     80        Accept
A2         2       Initial    80     70        Accept
#一个tible:2 x 5
#分组:患者编号[2]
患者ID初始值\u重复值2接受\u拒绝
1 A1重复95 80接受
2 A2首字母80 70接受

无需额外的库:

df1 <- with(df, data.frame(PatientID=tapply(PatientID, PatientID, 
    function(x) x[length(x)])))
df1$Inital_Repeat <- with(df, tapply(Initial_Repeat, PatientID, 
    function(x) levels(Initial_Repeat)[x[length(x)]]))
for (v in c('Value', 'Value2')) 
    df1[[v]] <- tapply(df[[v]], df$PatientID, function(x) x[!is.na(x)][1])
df1$Accept_Reject <- with(df, tapply(Accept_Reject, PatientID,
    function(x) levels(Accept_Reject)[x[length(x)]]))
请注意,
Inital\u Repeat
Accept\u Reject
因子


编辑:
PatientID
也是一个
因素,这就是为什么我们有
1
2
用于
PatientID
。要使用“A1”和“A2”,请将第2行的
x[长度(x)]
更改为
levels(x)[x[长度(x)]]
。此外,第4行的
级别(初始重复)
可以替换为
级别(x)
,第8行的
级别(接受/拒绝)

无需额外的库:

df1 <- with(df, data.frame(PatientID=tapply(PatientID, PatientID, 
    function(x) x[length(x)])))
df1$Inital_Repeat <- with(df, tapply(Initial_Repeat, PatientID, 
    function(x) levels(Initial_Repeat)[x[length(x)]]))
for (v in c('Value', 'Value2')) 
    df1[[v]] <- tapply(df[[v]], df$PatientID, function(x) x[!is.na(x)][1])
df1$Accept_Reject <- with(df, tapply(Accept_Reject, PatientID,
    function(x) levels(Accept_Reject)[x[length(x)]]))
请注意,
Inital\u Repeat
Accept\u Reject
因子


编辑:
PatientID
也是一个
因素,这就是为什么我们有
1
2
用于
PatientID
。要使用“A1”和“A2”,请将第2行的
x[长度(x)]
更改为
levels(x)[x[长度(x)]]
。另外,第4行的
级别(初始\u重复)
可以替换为
级别(x)
,第8行的
级别(接受\u拒绝)
也可以。

我还发现
tidyverse
中的工具也可以完成这项工作。它比
zoo
稍慢,但可读性更好,需要加载的包更少

library(tidyverse)

df <- df %>%
  group_by(Patient_ID) %>%
  fill(names(df), .direction = "down") %>%
  filter(row_number() == n())
库(tidyverse)
df%
分组依据(患者ID)%>%
填充(名称(df),.direction=“down”)%%>%
过滤器(行号()==n())

我还发现
tidyverse中的工具也能完成这项工作。它比
zoo
稍慢,但可读性更好,需要加载的包更少

library(tidyverse)

df <- df %>%
  group_by(Patient_ID) %>%
  fill(names(df), .direction = "down") %>%
  filter(row_number() == n())
库(tidyverse)
df%
分组依据(患者ID)%>%
填充(名称(df),.direction=“down”)%%>%
过滤器(行号()==n())

最常见的是2行,但可能更多。当它是多行时,是否是一系列NA,直到找到正确答案?如果是,那么
mean
na.rm=TRUE
(正如我所做的)可能效果最好。试试看。我想是的,但是我必须得到更多关于数据的信息。(我最近开始担任这个职位)。显然,在一些情况下,列中有多个数据,而不仅仅是NAs。在这种情况下,我的答案和Ryan Runge的答案都不正确。chan1142给出了选择成功值的第一个实例的答案。它通常是2行,但可能更多。当它是多行时,在找到正确答案之前是一系列NA吗?如果是,那么
mean
na.rm=TRUE
(正如我所做的)可能效果最好。试试看。我想是的,但是我必须得到更多关于数据的信息。(我最近开始担任这个职位)。显然,在一些情况下,列中有多个数据,而不仅仅是NAs。在这种情况下,我的答案和Ryan Runge的答案都不正确。chan1142给出选择成功值的第一个实例的答案。