等效于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变得毫无意义…向量化解决方案将是
键向量化解决方案将是
键向量化解决方案将是
键向量化解决方案将是