等效于SAS格式(R格式)
假设我有一个数据帧:等效于SAS格式(R格式),r,merge,lookup,R,Merge,Lookup,假设我有一个数据帧: sick <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17") code <- c("heart", "heart", "lung", "lung", "cancer", "cancer") sick_code <- data.frame(sick, code) sick您可以使用merge和all.x=TRUE(将p\u sick中的值保持在sick\u cod
sick <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17")
code <- c("heart", "heart", "lung", "lung", "cancer", "cancer")
sick_code <- data.frame(sick, code)
sick您可以使用merge
和all.x=TRUE
(将p\u sick
中的值保持在sick\u code
中不匹配:
merge(p_sick, sick_code, all.x = TRUE)
一种等效方法是使用dplyr中的左联合
:
library(dplyr)
left_join(p_sick, sick_code)
# pid sick code
# 1 212 - <NA>
# 2 2366 - <NA>
# 3 325 - <NA>
# 4 269 - <NA>
# 5 501 daa16 cancer
# 6 1352 SO <NA>
您可以使用merge
和all.x=TRUE
(将p\u sick
中的值保持在sick\u code
中不匹配:
merge(p_sick, sick_code, all.x = TRUE)
一种等效方法是使用dplyr中的左联合
:
library(dplyr)
left_join(p_sick, sick_code)
# pid sick code
# 1 212 - <NA>
# 2 2366 - <NA>
# 3 325 - <NA>
# 4 269 - <NA>
# 5 501 daa16 cancer
# 6 1352 SO <NA>
您可以使用merge
和all.x=TRUE
(将p\u sick
中的值保持在sick\u code
中不匹配:
merge(p_sick, sick_code, all.x = TRUE)
一种等效方法是使用dplyr中的左联合
:
library(dplyr)
left_join(p_sick, sick_code)
# pid sick code
# 1 212 - <NA>
# 2 2366 - <NA>
# 3 325 - <NA>
# 4 269 - <NA>
# 5 501 daa16 cancer
# 6 1352 SO <NA>
您可以使用merge
和all.x=TRUE
(将p\u sick
中的值保持在sick\u code
中不匹配:
merge(p_sick, sick_code, all.x = TRUE)
一种等效方法是使用dplyr中的左联合
:
library(dplyr)
left_join(p_sick, sick_code)
# pid sick code
# 1 212 - <NA>
# 2 2366 - <NA>
# 3 325 - <NA>
# 4 269 - <NA>
# 5 501 daa16 cancer
# 6 1352 SO <NA>
数据。表
适用于您的示例:
library(data.table)
setkey(setDT(p_sick),sick)
p_sick[setDT(sick_code),code := i.code][]
pid sick code
1: 3137 - NA
2: 755 - NA
3: 1327 - NA
4: 929 - NA
5: 939 daa16 cancer
6: 906 SO NA
有关详细说明,请参见。数据。表将适用于您的示例:
library(data.table)
setkey(setDT(p_sick),sick)
p_sick[setDT(sick_code),code := i.code][]
pid sick code
1: 3137 - NA
2: 755 - NA
3: 1327 - NA
4: 929 - NA
5: 939 daa16 cancer
6: 906 SO NA
有关详细说明,请参见。数据。表将适用于您的示例:
library(data.table)
setkey(setDT(p_sick),sick)
p_sick[setDT(sick_code),code := i.code][]
pid sick code
1: 3137 - NA
2: 755 - NA
3: 1327 - NA
4: 929 - NA
5: 939 daa16 cancer
6: 906 SO NA
有关详细说明,请参见。数据。表将适用于您的示例:
library(data.table)
setkey(setDT(p_sick),sick)
p_sick[setDT(sick_code),code := i.code][]
pid sick code
1: 3137 - NA
2: 755 - NA
3: 1327 - NA
4: 929 - NA
5: 939 daa16 cancer
6: 906 SO NA
有关详细说明,请参见。一个简单的命名向量也可以使用。命名向量可以用作查找。因此,与其将sick和code定义为数据帧,不如将其定义为命名向量并将其用作解码。如下所示:
# Set up named vector
sick_decode <- c("heart", "heart", "lung", "lung", "cancer", "cancer")
names(sick_decode) <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17")
# Prepare data
pid <- abs(round(rnorm(6)*1000,0))
sick <- c("-" , "-", "-", "-", "daa16", "SO")
p_sick <- data.frame(pid, sick)
# Create new variable using decode
p_sick$sick_decode <- sick_decode[p_sick$sick]
# Results
#> pid sick sick_decode
#> 1 511 - <NA>
#> 2 1619 - <NA>
#> 3 394 - <NA>
#> 4 641 - <NA>
#> 5 53 daa16 cancer
#> 6 244 SO <NA>
#设置命名向量
病人解码553 daa16癌症
#>6244如此
我怀疑这种方法也会很快,但还没有对其进行基准测试
另外,现在有一个R包专门用于在R中复制SAS格式功能。它被称为。一个简单的命名向量也可以工作。命名向量可以用作查找。因此,与其将sick和code定义为数据帧,不如将其定义为命名向量并将其用作解码。如下所示:
# Set up named vector
sick_decode <- c("heart", "heart", "lung", "lung", "cancer", "cancer")
names(sick_decode) <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17")
# Prepare data
pid <- abs(round(rnorm(6)*1000,0))
sick <- c("-" , "-", "-", "-", "daa16", "SO")
p_sick <- data.frame(pid, sick)
# Create new variable using decode
p_sick$sick_decode <- sick_decode[p_sick$sick]
# Results
#> pid sick sick_decode
#> 1 511 - <NA>
#> 2 1619 - <NA>
#> 3 394 - <NA>
#> 4 641 - <NA>
#> 5 53 daa16 cancer
#> 6 244 SO <NA>
#设置命名向量
病人解码553 daa16癌症
#>6244如此
我怀疑这种方法也会很快,但还没有对其进行基准测试
另外,现在有一个R包专门用于在R中复制SAS格式功能。它被称为。一个简单的命名向量也可以工作。命名向量可以用作查找。因此,与其将sick和code定义为数据帧,不如将其定义为命名向量并将其用作解码。如下所示:
# Set up named vector
sick_decode <- c("heart", "heart", "lung", "lung", "cancer", "cancer")
names(sick_decode) <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17")
# Prepare data
pid <- abs(round(rnorm(6)*1000,0))
sick <- c("-" , "-", "-", "-", "daa16", "SO")
p_sick <- data.frame(pid, sick)
# Create new variable using decode
p_sick$sick_decode <- sick_decode[p_sick$sick]
# Results
#> pid sick sick_decode
#> 1 511 - <NA>
#> 2 1619 - <NA>
#> 3 394 - <NA>
#> 4 641 - <NA>
#> 5 53 daa16 cancer
#> 6 244 SO <NA>
#设置命名向量
病人解码553 daa16癌症
#>6244如此
我怀疑这种方法也会很快,但还没有对其进行基准测试
另外,现在有一个R包专门用于在R中复制SAS格式功能。它被称为。一个简单的命名向量也可以工作。命名向量可以用作查找。因此,与其将sick和code定义为数据帧,不如将其定义为命名向量并将其用作解码。如下所示:
# Set up named vector
sick_decode <- c("heart", "heart", "lung", "lung", "cancer", "cancer")
names(sick_decode) <- c("daa12", "daa13", "daa14", "daa15", "daa16", "daa17")
# Prepare data
pid <- abs(round(rnorm(6)*1000,0))
sick <- c("-" , "-", "-", "-", "daa16", "SO")
p_sick <- data.frame(pid, sick)
# Create new variable using decode
p_sick$sick_decode <- sick_decode[p_sick$sick]
# Results
#> pid sick sick_decode
#> 1 511 - <NA>
#> 2 1619 - <NA>
#> 3 394 - <NA>
#> 4 641 - <NA>
#> 5 53 daa16 cancer
#> 6 244 SO <NA>
#设置命名向量
病人解码553 daa16癌症
#>6244如此
我怀疑这种方法也会很快,但还没有对其进行基准测试
另外,现在有一个R包专门用于在R中复制SAS格式功能。它被称为。我将尝试测试data.table和merge之间的差异,因为merge非常慢,data.table
比merge
快。我建议使用setDT()
通过引用将data.frames转换为data.tables。如果对象足够大,单独使用data.table()转换为data.tables将占用两倍的内存且速度较慢(由于复制),这可能会使使用data.tables变得毫无意义…我将尝试测试data.table和merge之间的差异,因为merge非常慢,data.table
比merge
快。我建议使用setDT()
通过引用将data.frames转换为data.tables。如果对象足够大,单独使用data.table()转换为data.tables将占用两倍的内存且速度较慢(由于复制),这可能会使使用data.tables变得毫无意义…我将尝试测试data.table和merge之间的差异,因为merge非常慢,data.table
比merge
快。我建议使用setDT()
通过引用将data.frames转换为data.tables。如果对象足够大,单独使用data.table()转换为data.tables将占用两倍的内存且速度较慢(由于复制),这可能会使使用data.tables变得毫无意义…我将尝试测试data.table和merge之间的差异,因为merge非常慢,data.table
比merge
快。我建议使用setDT()
通过引用将data.frames转换为data.tables。如果对象足够大,单独使用data.table()转换为data.tables将占用两倍的内存且速度较慢(由于复制),这可能使使用data.tables变得毫无意义…向量化解决方案将是键向量化解决方案将是键向量化解决方案将是键向量化解决方案将是键