r - 在 R 中创建 data.frame 列组合的索引

标签 r dataframe indexing

这个问题与此有关 one ,但是我想使用两个 data.frame 列的唯一组合来创建索引。
所以我的数据结构看起来像这样(dput):

structure(list(avg = c(0.246985988921473, 0.481522354272779, 
0.575400762275067, 0.14651009243539, 0.489308880181752, 0.523678968337178
), i_ID = c("H", "H", "C", "C", "H", "S"), j_ID = c("P", "P", 
"P", "P", "P", "P")), .Names = c("avg", "i_ID", "j_ID"), row.names = 7:12, class = "data.frame")

因此,为上述结构创建的索引应如下所示
1
1
2
2
1
3

在示例数据中,列 j_ID 始终具有值 P,但情况并非总是如此。此外,反之亦然(S-P 或 P-S)组合应产生相同的索引。

有人知道实现这一目标的好方法吗?我可以用很多 for 循环和 if-else 命令来做到这一点,但这并不优雅。

最佳答案

interaction功能将运作良好。

foo = structure(list(avg = c(0.246985988921473, 0.481522354272779, 0.575400762275067, 0.14651009243539, 0.489308880181752, 0.523678968337178), i_ID = c("H", "H", "C", "C", "H", "S"), j_ID = c("P", "P", "P", "P", "P", "P")), .Names = c("avg", "i_ID", "j_ID"), row.names = 7:12, class = "data.frame")

foo$idx <- as.integer(interaction(foo$i_ID, foo$j_ID))

> foo
         avg i_ID j_ID idx
7  0.2469860    H    P   2
8  0.4815224    H    P   2
9  0.5754008    C    P   1
10 0.1465101    C    P   1
11 0.4893089    H    P   2
12 0.5236790    S    P   3

啊,我看书不够仔细。可能有更优雅的解决方案,但您可以使用 outer函数和上下三角形:
# lets assign some test values
x <- c('a', 'b', 'c') 
foo$idx <- c('a b', 'b a', 'b c', 'c b', 'a a', 'b a') 

mat <- outer(x, x, FUN = 'paste') # gives all possible combinations
uppr_ok <- mat[upper.tri(mat, diag=TRUE)]
mat_ok <- mat
mat_ok[lower.tri(mat)] <- mat[upper.tri(mat)]

然后你可以匹配在 mat 中找到的索引与在 mat_ok 中发现的那些.
foo$idx <- mat_ok[match(foo$idx, mat)]

但是......我敢打赌我缺少一个方便的功能......

关于r - 在 R 中创建 data.frame 列组合的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15098567/

相关文章:

r - 为什么 apply() 不适用于 R 中的数据框?

r - 调整 key_glyph ggplot 生成的图例字形的高度和宽度

python - 如何在 Pandas 数据框中拆分一列元组?

python - 从变量中的值构造pandas DataFrame给出 "ValueError: If using all scalar values, you must pass an index"

python - fillna() 和 map(dict) 不仅填充 NaN,还填充所有值

python - 如何让 Python 区分相等的整数

sql - 我应该索引已经是复合索引一部分的个别列吗?

r - 如何按升序对r中数据框的所有列进行排序?

使用 dplyr::filter() 删除 NA 观测值

Python 复杂对象索引 - 访问特定嵌套元素时遇到问题