我想在数据框中添加一个新列,根据数据框最后一列中显示的索引显示变量。
我的数据框架是这样的:
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
最后。
有没有人对如何做到这一点?
答案 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