※ 引述《hirdaramani (Hirdaramani)》之铭言:
:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [软件熟悉度]:
: 请把以下不需要的部份删除
: 新手~~
: [问题叙述]:
: A档案是name,B档案有name和age
: 想要知道当发现A某个name的时候 可以去B的data.frame找到他的age
: [程式范例]:
: name <- c("Joe", "Bob", "Vicky")
: age <- c("28", "26", "34")
: data <- data.frame(name, age)
: name_data <-c("Joe", "Bob", "Vicky")
: for (i in name_data){
: for(x in 1:length(data$name))
: {
: if(i ==data$name[x])
: age_x <- data$age[x]
: }
: }
: 以上是我自己想出来用两个循环写的 只是感觉有点蠢,应该有更聪明方便的方法
: 本质上我就是想要类似excel的vlookup但是要可以在去叫出那个值。
: 谢谢各位前辈的分享教学
: 想要增进自己的能力避免自己只会当LOSER~~~~
:
library(data.table)
library(dplyr)
DT <- data.table(name = c("Joe", "Bob", "Vicky"),
age = c(28, 26, 34))
queryNames <- c("Joe", "Bob")
## dplyr
# length(queryNames) == 1
filter(DT, name == queryNames[1])
# length(queryNames) > 1
filter(DT, name %in% queryNames)
## data.table
# length(queryNames) == 1
DT[name == queryNames[1]]
# length(queryNames) > 1
DT[name %in% queryNames]
另外前一篇提到join
data.table::merge 或是 dplyr::*_join的适用情况比较像下面这样
DT <- data.table(name = c("Joe", "Bob", "Vicky"),
sex = c("M", "M", "F")
age = c(28, 26, 34))
queryConDT <- data.table(name = c("Joe", "Vicky"),
sex = c("M", "F"))
# dplyr
inner_join(DT, queryConDT)
# merge
merge(DT, queryConDT)
也就是有两个以上条件要做查询的时候再去使用
merge, *_join 为了去join还有做不少运算
能够用 == 或是 %in% 处理就用这些运算子处理