在 r 中的行和列之间执行查找函数
doing a lookup function between rows and columns in r
我有一个数据框,其中有一列在下面的虚拟数据中称为 ID,其值与几个后续列名称中的 1 个匹配。我想做一些查找函数,它可以看到 ID 的值,找到匹配的列,然后给出该行的值。
ID = c("A", "A", "B", "B", "B", "C", "C")
A = c(1, 2, 3, 4, 5, 6, 7)
B = c(8, 9, 10, 11, 12, 13, 14)
C = c("set1", "set2", "set1", "set2", "set3", "set1", "set2")
df = data.frame(ID, A, B, C)
#pseudo code:
#df$newrow <- for df, if ID == Column Name, then Column Name & Row Value
我想要的输出:
ID A B C newrow
1 A 1 8 set1 1
2 A 2 9 set2 2
3 B 3 10 set1 10
4 B 4 11 set2 11
5 B 5 12 set3 12
6 C 6 13 set1 set1
7 C 7 14 set2 set2
我可以用一堆 if/then 语句来概念化它,但实际数据有更多的列,我想知道是否有更好的方法/或特定的命令来做。
您可以使用以下解决方案:
library(dplyr)
df %>%
rowwise() %>%
mutate(new_col = as.character(get(ID)))
# A tibble: 7 x 5
# Rowwise:
ID A B C new_col
<chr> <dbl> <dbl> <chr> <chr>
1 A 1 8 set1 1
2 A 2 9 set2 2
3 B 3 10 set1 10
4 B 4 11 set2 11
5 B 5 12 set3 12
6 C 6 13 set1 set1
7 C 7 14 set2 set2
实现您想要的结果的基础 R 选项:
df$newrow <- diag(as.matrix(df[seq(nrow(df)), df$ID]))
df
#> ID A B C newrow
#> 1 A 1 8 set1 1
#> 2 A 2 9 set2 2
#> 3 B 3 10 set1 10
#> 4 B 4 11 set2 11
#> 5 B 5 12 set3 12
#> 6 C 6 13 set1 set1
#> 7 C 7 14 set2 set2
我有一个数据框,其中有一列在下面的虚拟数据中称为 ID,其值与几个后续列名称中的 1 个匹配。我想做一些查找函数,它可以看到 ID 的值,找到匹配的列,然后给出该行的值。
ID = c("A", "A", "B", "B", "B", "C", "C")
A = c(1, 2, 3, 4, 5, 6, 7)
B = c(8, 9, 10, 11, 12, 13, 14)
C = c("set1", "set2", "set1", "set2", "set3", "set1", "set2")
df = data.frame(ID, A, B, C)
#pseudo code:
#df$newrow <- for df, if ID == Column Name, then Column Name & Row Value
我想要的输出:
ID A B C newrow
1 A 1 8 set1 1
2 A 2 9 set2 2
3 B 3 10 set1 10
4 B 4 11 set2 11
5 B 5 12 set3 12
6 C 6 13 set1 set1
7 C 7 14 set2 set2
我可以用一堆 if/then 语句来概念化它,但实际数据有更多的列,我想知道是否有更好的方法/或特定的命令来做。
您可以使用以下解决方案:
library(dplyr)
df %>%
rowwise() %>%
mutate(new_col = as.character(get(ID)))
# A tibble: 7 x 5
# Rowwise:
ID A B C new_col
<chr> <dbl> <dbl> <chr> <chr>
1 A 1 8 set1 1
2 A 2 9 set2 2
3 B 3 10 set1 10
4 B 4 11 set2 11
5 B 5 12 set3 12
6 C 6 13 set1 set1
7 C 7 14 set2 set2
实现您想要的结果的基础 R 选项:
df$newrow <- diag(as.matrix(df[seq(nrow(df)), df$ID]))
df
#> ID A B C newrow
#> 1 A 1 8 set1 1
#> 2 A 2 9 set2 2
#> 3 B 3 10 set1 10
#> 4 B 4 11 set2 11
#> 5 B 5 12 set3 12
#> 6 C 6 13 set1 set1
#> 7 C 7 14 set2 set2