我有一个数据框
TableName Function Argument
A func1 3
B func1 4
A func2 6
B func2 2
C func1 5
我想首先在数据框中找出唯一的TableName,使用唯一函数很简单。但是,我还需要将unique的索引映射到值。
TableName Index
A 1 3
B 2 4
C 5
稍后,我想读取此输出以获取唯一的TableName值(例如A),然后使用与之对应的每个索引(依次为1和3)来执行某些操作。
请给我建议一种方法。
答案 0 :(得分:2)
这是一个<div class="pane-content">
解决方案,其中我们使用dplyr
创建一个变量,并将其用作我们的索引,即
row_number()
给出,
df %>% mutate(new = row_number()) %>% group_by(TableName) %>% summarise(Index = toString(new))
您还可以将它们另存为列表而不是字符串,这将使以后的操作变得更容易,例如
# A tibble: 3 x 2
TableName Index
<fct> <chr>
1 A 1, 3
2 B 2, 4
3 C 5
给出,
df %>% mutate(new = row_number()) %>% group_by(TableName) %>% summarise(Index = list(new))
答案 1 :(得分:2)
不需要任何包装。试试:
aggregate(rownames(df) ~ TableName, df, c)
TableName rownames(df)
1 A 1, 3
2 B 2, 4
3 C 5
# or
setNames(aggregate(rownames(df) ~ TableName, df, c),
c("TableName", "Index"))
TableName Index
1 A 1, 3
2 B 2, 4
3 C 5
答案 2 :(得分:1)
我建议只使用其中之一
(vec <- tapply(df$Argument, df$TableName, FUN = `identity`))
# $A
# [1] 3 6
#
# $B
# [1] 4 2
#
# $C
# [1] 5
或
(dfNew <- data.frame(TableName = unique(df$TableName), Index = vec))
# TableName Index
# A A 3, 6
# B B 4, 2
# C C 5
vec
是一个列表(而不是带有连接数字的字符),可以轻松访问names(vec)
,例如,
vec$A
# [1] 3 6
而dfNew
是一个数据框,其第二列也是列表:
dfNew[2]
# Index
# A 3, 6
# B 4, 2
# C 5
dfNew[,2]
# [[1]]
# [1] 3 6
#
# [[2]]
# [1] 4 2
#
# [[3]]
# [1] 5
dfNew[2]["A",][[1]]
# [1] 3 6
但是,在这种情况下,通过TableName
到达索引并不方便,所以我坚持使用vec
。
答案 3 :(得分:1)
使用data.table
:
setDT(data)[, .(Index = toString(.I)), TableName]
TableName Index
1: A 1, 3
2: B 2, 4
3: C 5