我有以下代码,它产生我想要的东西,但我几乎可以肯定它可以写得更好(也需要很长时间才能执行)。有关如何清理它的任何建议吗?
我的基本想法是,对于var3
og var1
的每个唯一组合,我想要一个包含变量var2
中“最高”字母(A,B或C)的表格
var1 <- c(rep.int(1:3,3))
var2 <- c(sample(letters[1:3],
NROW(var1),
replace = TRUE))
var3 <- c(sample(LETTERS[1:3],
NROW(var1),
replace = TRUE))
df <- data.frame(var1,
var2,
var3)
x <- capture.output(for (i in unique(df$var1)) {
for (j in unique(df$var2)) {
ifelse(
"A" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1]
,print("A"),
ifelse(
"B" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1],
print("B"),
ifelse(
"C" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1],
print("C"),0
)
)
)
}
})
as.data.frame(cbind(x,unique(paste(df$var1,df$var2))))
答案 0 :(得分:2)
我们可以使用data.table
。我们将'data.frame'转换为'data.table'(setDT(df)
),按'var1'分组,'var2',我们将'var3'转换为factor
{{1}指定,获取最小值索引(levels
)并对数据集(which.min
)进行子集
.SD
或者在分组后,我们将library(data.table)
setDT(df)[, .SD[which.min(factor(var3,
levels=LETTERS[1:3]))] ,.(var1, var2)]
'var3'转换为order
并获得Data.table(factor
)子集的第一次观察。
.SD
答案 1 :(得分:0)
我会使用dplyr
,就像这里:
library("dplyr")
df %>%
group_by(var1, var2) %>%
summarise(maksymalna=max(as.character(var3)))
它提供的输出与你的输出不同(可能是你的功能错了),但我认为这是正确的。你能查一下吗?