如何根据R中的不同列值获得结果
我有以下数据:如何根据R中的不同列值获得结果,r,R,我有以下数据: V1 V2 V3 A 0 0 0 A 0 0 A 0 0 A B 0 0 A B B A B B 0 B 0 A 预期结果:(示例:如果3列中的任何一列只包含一个,则结果应为1) 我的数据集的所需输出应为: V1 V2 V3 Result A 0 0 1 0 A 0 1 0 A 0 1 0 A B 3 0 0 A 1 B B A 3
V1 V2 V3
A 0 0
0 A 0
0 A 0
0 A B
0 0 A
B B A
B B 0
B 0 A
预期结果:(示例:如果3列中的任何一列只包含一个,则结果应为1)
我的数据集的所需输出应为:
V1 V2 V3 Result
A 0 0 1
0 A 0 1
0 A 0 1
0 A B 3
0 0 A 1
B B A 3
B B 0 2
B 0 A 3
有人能帮助我如何在R中实现这一点吗?我假设您的原始数据是字符, 因此,您可能可以将它们转换为因子,并利用R在内部将因子映射为整数这一事实。 这些因子水平从1开始,因此最终必须调整输出, 但这里有一个如何做到这一点的例子:
# specify the order so that "0"=1L, "A"=2L, "B"=3L
levels <- c("0", "A", "B")
# sample data
df <- expand.grid(levels, levels, levels, stringsAsFactors = FALSE)
# substitute df with your data frame
columns_list <- lapply(df, function(column) {
unclass(factor(column, levels = levels)) - 1L
})
foo <- function(...) {
sum(unique(c(...)))
}
df$Result <- unlist(do.call(Map, c(list(f = foo), columns_list)))
head(df)
Var1 Var2 Var3 Result
1 0 0 0 0
2 A 0 0 1
3 B 0 0 2
4 0 A 0 1
5 A A 0 1
6 B A 0 3
#指定顺序,使“0”=1L,“A”=2L,“B”=3L
级别一个选项是将c(“0”、“A”、“B”)
重新标记为c(“0”、“1”、“2”)
,然后使用apply
获取唯一行数据的总和
df$Result <- apply(df, 1, function(x){
sum(as.numeric(as.character(factor(unique(x), levels = c("0","A","B"),
labels = c("0", "1", "2")))))
})
#Result
df
# V1 V2 V3 Result
# 1 0 0 0 0
# 2 A 0 0 1
# 3 0 A 0 1
# 4 0 A 0 1
# 5 0 A B 3
# 6 0 0 A 1
# 7 B B A 3
# 8 B B 0 2
# 9 B 0 A 3
df$结果请使用dput
功能添加原始数据;当出现B
时会发生什么?谢谢。“这对我很有帮助。”斯洛伦很高兴知道。谢谢您可以通过单击答案框左侧的勾号符号来接受答案。
df$Result <- apply(df, 1, function(x){
sum(as.numeric(as.character(factor(unique(x), levels = c("0","A","B"),
labels = c("0", "1", "2")))))
})
#Result
df
# V1 V2 V3 Result
# 1 0 0 0 0
# 2 A 0 0 1
# 3 0 A 0 1
# 4 0 A 0 1
# 5 0 A B 3
# 6 0 0 A 1
# 7 B B A 3
# 8 B B 0 2
# 9 B 0 A 3
df <- read.table(text =
"V1 V2 V3
0 0 0
A 0 0
0 A 0
0 A 0
0 A B
0 0 A
B B A
B B 0
B 0 A",
header = TRUE, stringsAsFactors = FALSE)