Cur*_*lew 9 indexing r dataframe
这个问题是一种与此相关的一个,但是我想创建使用两种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")
Run Code Online (Sandbox Code Playgroud)
因此,上述结构的创建索引应如下所示
1
1
2
2
1
3
Run Code Online (Sandbox Code Playgroud)
在示例数据中,列j_ID始终具有值P,但情况并非总是如此.此外,反之亦然(SP或PS)组合应该产生相同的索引.
有人知道一个很好的方法来实现这一目标吗?我可以用很多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
Run Code Online (Sandbox Code Playgroud)
啊,我没有仔细阅读.可能有更优雅的解决方案,但您可以使用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)]
Run Code Online (Sandbox Code Playgroud)
然后,您可以将找到的索引mat与找到的索引进行匹配mat_ok.
foo$idx <- mat_ok[match(foo$idx, mat)]
Run Code Online (Sandbox Code Playgroud)
但是......我打赌我有一个方便的功能我错过了......
| 归档时间: |
|
| 查看次数: |
2483 次 |
| 最近记录: |