获取一式三份记录的 rowSums 并仅保留具有最高值的记录
Getting rowSums for triplicate records and retaining only the one with highest value
我有一个包含 163 个观察值和 65 列动物数据的数据框。 163 次观察来自 56 只动物,每只都应该有三次记录,但有些信息丢失了,所以对于大多数动物,我有三次重复("A"、"B"、"C" ) 对于一些我只有重复项(在 "A" 和 "B"、"A" 和 "C" 以及 "B" 和 "C" 之间有所不同)。
列13:65包含一些我想求和的信息,并且只保留具有较高rowSums值的一式三份。所以我的数据框是这样的:
ID Trip Acet Cell Fibe Mega Tera
1 4 A 2 4 9 8 3
2 4 B 9 3 7 5 5
3 4 C 1 2 4 8 6
4 12 A 4 6 7 2 3
5 12 B 6 8 1 1 2
6 12 C 5 5 7 3 3
我不确定我需要的是编写我自己的函数,还是一个循环,或者实际上最好的选择是什么 - 抱歉,我还在学习,不幸的是,对我来说,我不像程序员那样思考这让事情变得更具挑战性...
所以我想知道保留第 2 行和第 6 行(在每只动物的三次重复中具有最高的 rowSums),但对于整个数据框。结果我想要的是
ID Trip Acet Cell Fibe Mega Tera
1 4 B 9 3 7 5 5
2 12 C 5 5 7 3 3
非常抱歉,如果问题没有详细阐述或没有意义,这是我第一次在这里提问,我最近才开始学习 R。
我们可以单独创建行总和,并使用它来通过 ave
找到具有最大行总和的行。然后使用逻辑向量对数据集
的行进行子集化
nm1 <- startsWith(names(df1), "V")
OP 更新了列名。在这种情况下,索引
nm1 <- 3:7
或 select 具有 setdiff
的列
nm1 <- setdiff(names(df1), c("ID", "Trip"))
v1 <- rowSums(df1[nm1], na.rm = TRUE)
i1 <- with(df1, v1 == ave(v1, ID, FUN = max))
df1[i1,]
# ID Trip V1 V2 V3 V4 V5
#2 4 B 9 3 7 5 5
#6 12 C 5 5 7 3 3
数据
df1 <- structure(list(ID = c(4L, 4L, 4L, 12L, 12L, 12L), Trip = structure(c(1L,
2L, 3L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"),
V1 = c(2L, 9L, 1L, 4L, 6L, 5L), V2 = c(4L, 3L, 2L, 6L, 8L,
5L), V3 = c(9L, 7L, 4L, 7L, 1L, 7L), V4 = c(8L, 5L, 8L, 2L,
1L, 3L), V5 = c(3L, 5L, 6L, 3L, 2L, 3L)),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
这是一种方法。
library(tidyverse)
dat2 <- dat %>%
mutate(Sum = rowSums(select(dat, starts_with("V")))) %>%
group_by(ID) %>%
filter(Sum == max(Sum)) %>%
select(-Sum) %>%
ungroup()
dat2
# # A tibble: 2 x 7
# ID Trip V1 V2 V3 V4 V5
# <int> <fct> <int> <int> <int> <int> <int>
# 1 4 B 9 3 7 5 5
# 2 12 C 5 5 7 3 3
这是另一个。此方法确保仅保留一行,即使有多行的行总和等于最大值。
dat3 <- dat %>%
mutate(Sum = rowSums(select(dat, starts_with("V")))) %>%
arrange(ID, desc(Sum)) %>%
group_by(ID) %>%
slice(1) %>%
select(-Sum) %>%
ungroup()
dat3
# # A tibble: 2 x 7
# ID Trip V1 V2 V3 V4 V5
# <int> <fct> <int> <int> <int> <int> <int>
# 1 4 B 9 3 7 5 5
# 2 12 C 5 5 7 3 3
数据
dat <- read.table(text = " ID Trip V1 V2 V3 V4 V5
1 4 A 2 4 9 8 3
2 4 B 9 3 7 5 5
3 4 C 1 2 4 8 6
4 12 A 4 6 7 2 3
5 12 B 6 8 1 1 2
6 12 C 5 5 7 3 3 ",
header = TRUE)
我有一个包含 163 个观察值和 65 列动物数据的数据框。 163 次观察来自 56 只动物,每只都应该有三次记录,但有些信息丢失了,所以对于大多数动物,我有三次重复("A"、"B"、"C" ) 对于一些我只有重复项(在 "A" 和 "B"、"A" 和 "C" 以及 "B" 和 "C" 之间有所不同)。
列13:65包含一些我想求和的信息,并且只保留具有较高rowSums值的一式三份。所以我的数据框是这样的:
ID Trip Acet Cell Fibe Mega Tera
1 4 A 2 4 9 8 3
2 4 B 9 3 7 5 5
3 4 C 1 2 4 8 6
4 12 A 4 6 7 2 3
5 12 B 6 8 1 1 2
6 12 C 5 5 7 3 3
我不确定我需要的是编写我自己的函数,还是一个循环,或者实际上最好的选择是什么 - 抱歉,我还在学习,不幸的是,对我来说,我不像程序员那样思考这让事情变得更具挑战性...
所以我想知道保留第 2 行和第 6 行(在每只动物的三次重复中具有最高的 rowSums),但对于整个数据框。结果我想要的是
ID Trip Acet Cell Fibe Mega Tera
1 4 B 9 3 7 5 5
2 12 C 5 5 7 3 3
非常抱歉,如果问题没有详细阐述或没有意义,这是我第一次在这里提问,我最近才开始学习 R。
我们可以单独创建行总和,并使用它来通过 ave
找到具有最大行总和的行。然后使用逻辑向量对数据集
nm1 <- startsWith(names(df1), "V")
OP 更新了列名。在这种情况下,索引
nm1 <- 3:7
或 select 具有 setdiff
nm1 <- setdiff(names(df1), c("ID", "Trip"))
v1 <- rowSums(df1[nm1], na.rm = TRUE)
i1 <- with(df1, v1 == ave(v1, ID, FUN = max))
df1[i1,]
# ID Trip V1 V2 V3 V4 V5
#2 4 B 9 3 7 5 5
#6 12 C 5 5 7 3 3
数据
df1 <- structure(list(ID = c(4L, 4L, 4L, 12L, 12L, 12L), Trip = structure(c(1L,
2L, 3L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"),
V1 = c(2L, 9L, 1L, 4L, 6L, 5L), V2 = c(4L, 3L, 2L, 6L, 8L,
5L), V3 = c(9L, 7L, 4L, 7L, 1L, 7L), V4 = c(8L, 5L, 8L, 2L,
1L, 3L), V5 = c(3L, 5L, 6L, 3L, 2L, 3L)),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
这是一种方法。
library(tidyverse)
dat2 <- dat %>%
mutate(Sum = rowSums(select(dat, starts_with("V")))) %>%
group_by(ID) %>%
filter(Sum == max(Sum)) %>%
select(-Sum) %>%
ungroup()
dat2
# # A tibble: 2 x 7
# ID Trip V1 V2 V3 V4 V5
# <int> <fct> <int> <int> <int> <int> <int>
# 1 4 B 9 3 7 5 5
# 2 12 C 5 5 7 3 3
这是另一个。此方法确保仅保留一行,即使有多行的行总和等于最大值。
dat3 <- dat %>%
mutate(Sum = rowSums(select(dat, starts_with("V")))) %>%
arrange(ID, desc(Sum)) %>%
group_by(ID) %>%
slice(1) %>%
select(-Sum) %>%
ungroup()
dat3
# # A tibble: 2 x 7
# ID Trip V1 V2 V3 V4 V5
# <int> <fct> <int> <int> <int> <int> <int>
# 1 4 B 9 3 7 5 5
# 2 12 C 5 5 7 3 3
数据
dat <- read.table(text = " ID Trip V1 V2 V3 V4 V5
1 4 A 2 4 9 8 3
2 4 B 9 3 7 5 5
3 4 C 1 2 4 8 6
4 12 A 4 6 7 2 3
5 12 B 6 8 1 1 2
6 12 C 5 5 7 3 3 ",
header = TRUE)