如何创建一行,将R中以前行的某些值组合在一起?
在我的数据中,有几行代表了重复测试的结果。重复中仅捕获某些值。我想做的是用repeat值创建一个新行,但如果repeat值为NA或空白,则从初始测试中提取 例如如何创建一行,将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
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给出选择成功值的第一个实例的答案。