Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据R中的不同列值获得结果_R - Fatal编程技术网

如何根据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)