我有一个包含一组规则(或键或词典;无论你怎么称呼它)的列表。
> list.prob[c(1,2)] [[1]] x no yes overcast 0.07692308 0.42857143 rainy 0.38461538 0.33333333 sunny 0.53846154 0.23809524
因此,给出阴天的价值" no"是-0.08并给出"是"是0.43。
[[2]] y x no yes cool 0.2307692 0.3333333 hot 0.3846154 0.2380952 mild 0.3846154 0.4285714
出于同样的原因,给出的热值" no"是0.38并给出"是"是0.24。
规则建立后,我有一个字符矩阵
> mat[c(1:4),] outlook temperature humidity windy [1,] "sunny" "hot" "high" "no" [2,] "sunny" "hot" "high" "yes" [3,] "overcast" "hot" "high" "no" [4,] "rainy" "mild" "high" "no"
提出问题"否"或"是",如何使用先前的规则并将矩阵中的单元格(存储为字符)转换为相应的数值。
答案 0 :(得分:1)
这样做你想要的吗?我不确定是/否在哪里发挥作用,所以我只是查了“是”的可能性。
a <- matrix(runif(6), nrow = 3)
weather <- c("sunny", "rainy", "overcast")
temp <- c("cool", "hot", "mild")
yn <- c("yes", "no")
rownames(a) <- weather
colnames(a) <- yn
b <- matrix(runif(6), nrow = 3)
rownames(b) <- temp
colnames(b) <- yn
c <- data.frame(weather = sample(weather, 10, replace = T),
temp = sample(temp, 10, replace = T))
d <- data.frame(weather = a[c$weather, "yes"], temp = b[c$temp, "yes"])
a
b
c
d
答案 1 :(得分:0)
你的例子不可复制,所以我试着这样做:
list.prob <-
list(structure(c(0.07692308, 0.38461538, 0.53846154, 0.42857143,
0.33333333, 0.23809524), .Dim = c(3L, 2L), .Dimnames = structure(list(
x = c("overcast", "rainy", "sunny"), y = c("no", "yes")), .Names = c("x",
"y"))), structure(c(0.2307692, 0.3846154, 0.3846154, 0.3333333,
0.2380952, 0.4285714), .Dim = c(3L, 2L), .Dimnames = structure(list(
x = c("cool", "hot", "mild"), y = c("no", "yes")), .Names = c("x",
"y"))))
mat <-
structure(c("sunny", "sunny", "overcast", "rainy", "hot", "hot",
"hot", "mild"), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("outlook",
"temperature")))
它提供了与您开始时非常相似的内容(限制mat
除外),只显示与list.prob
中的条目相对应的那些列:
> list.prob
[[1]]
y
x no yes
overcast 0.07692308 0.4285714
rainy 0.38461538 0.3333333
sunny 0.53846154 0.2380952
[[2]]
y
x no yes
cool 0.2307692 0.3333333
hot 0.3846154 0.2380952
mild 0.3846154 0.4285714
> mat
outlook temperature
[1,] "sunny" "hot"
[2,] "sunny" "hot"
[3,] "overcast" "hot"
[4,] "rainy" "mild"
然后您的问题是根据mat
中的表格翻译list.prob
中的每一列,但使用哪个列是以另一个变量的值为条件的(我将称之为{{1} }})。
yesorno
给
# setup
res <- matrix(0,nrow=nrow(mat),ncol=ncol(mat))
yesorno <- "yes"
# actual computation
for (col in seq_len(ncol(mat))) {
res[,col] <- list.prob[[col]][,yesorno][mat[,col]]
}
这假设> res
[,1] [,2]
[1,] 0.2380952 0.2380952
[2,] 0.2380952 0.2380952
[3,] 0.4285714 0.2380952
[4,] 0.3333333 0.4285714
的第一列对应于mat
的第一个元素等;如果映射不那么简单,那么你需要一些方法来关联它们(可能根据list.prob
的列名命名list.prob
的元素并循环遍历列名以进行查找mat
)。