根据列上的索引从数据框行中获取变量

时间:2018-02-15 11:05:13

标签: r dataframe

我想在数据框中添加一个新列,根据数据框最后一列中显示的索引显示变量。

我的数据框架是这样的:

 v1 v2 v3 v4 v5
1  A  K  F  W  2
2  B  O  J  Q  4
3  C  M  T  A  3
4  D  Z  R  B  2

所以想要得到这个

  v1 v2 v3 v4 v5 v6
1  A  K  F  W  2  K
2  B  O  J  Q  4  Q
3  C  M  T  A  3  T
4  D  Z  R  B  2  Z

最后。

有没有人对如何做到这一点?

3 个答案:

答案 0 :(得分:4)

我们可以通过cbind'{5}使用行/列索引,即列索引和行索引(1:nrow(df1)seq_len(nrow(df1)))来提取与前4列对应的元素数据集并将其分配给'v6'

df1$v6 <- df1[-5][cbind(1:nrow(df1), df1$v5)]
df1
#  v1 v2 v3 v4 v5 v6
#1  A  K  F  W  2  K
#2  B  O  J  Q  4  Q
#3  C  M  T  A  3  T
#4  D  Z  R  B  2  Z

答案 1 :(得分:1)

基础R中的另一个选项。我们可以使用sapply遍历数据框中的每一行,以根据第5列中的索引获取字符串。

dat$V6 <- sapply(1:nrow(dat), function(x) dat[-5][x, dat[[5]][x]])
dat
#   v1 v2 v3 v4 v5 V6
# 1  A  K  F  W  2  K
# 2  B  O  J  Q  4  Q
# 3  C  M  T  A  3  T
# 4  D  Z  R  B  2  Z

数据

dat <- read.table(text = " v1 v2 v3 v4 v5
1  A  K  F  W  2
                  2  B  O  J  Q  4
                  3  C  M  T  A  3
                  4  D  Z  R  B  2",
                  header = TRUE, stringsAsFactors = FALSE)

答案 2 :(得分:0)

尝试使用dplyr进行以下操作,添加了一个组变量来标识该行。变异不是完美的,因为我再次在其中复制df - 如果有人可以纠正它请分享:)。行索引需要grp var。

dfNew = df %>% mutate(grp = seq(1:nrow(df))) %>% group_by(grp) %>% mutate(v6 = df[grp,v5]) %>% ungroup() %>% select(-grp)

得到了结果,但也有一些警告(认为它们是因为char编码)。同意上述评论,请为数据创建添加一行代码

dfNew
# A tibble: 4 x 6
      v1     v2     v3     v4    v5    v6
    <fctr> <fctr> <fctr> <fctr> <dbl> <chr>
1      a      k      f      w     2     k
2      b      o      j      q     4     q
3      c      m      t      a     3     t
4      d      z      r      b     2     z