读取、重新编码、子集设置和重塑R中顺序标记的data.frames

读取、重新编码、子集设置和重塑R中顺序标记的data.frames,r,data.table,R,Data.table,我很难适应以前用来读入并重新编码顺序标记为data.tables的脚本 我在R中有一系列按顺序标记的data.tables:df1、df2、df3,等等。然后我会应用一些特定的(且不一致的)规则在这些数据中创建新变量。这些表被称为status和csat 我想做的是: 读入数据表 将csat变量重新编码为新变量 将data.table子集,使其仅包含4个变量(csat、csat\u d、id、和状态) 使用外部联接将data.table与以前的表合并(以便可以将其重塑为长格式) 我试图解决下面脚本

我很难适应以前用来读入并重新编码顺序标记为data.tables的脚本

我在R中有一系列按顺序标记的data.tables:
df1
df2
df3
,等等。然后我会应用一些特定的(且不一致的)规则在这些
数据中创建新变量。这些表被称为
status
csat

我想做的是:

  • 读入数据表
  • csat
    变量重新编码为新变量
  • 将data.table子集,使其仅包含4个变量(
    csat
    csat\u d
    id
    、和
    状态
  • 使用外部联接将data.table与以前的表合并(以便可以将其重塑为长格式)
  • 我试图解决下面脚本中的第1-3点,但不知道如何实现第4点

    编辑:


    我猜你想这么做

    out <- lapply( ll , function(x) x[ , csat := recode( csat , ,"1:5=0;6:7=1;NA=NA;" ) ][ , csat_vars , with = FALSE ] )
    

    out列出实际的
    data.table
    s,而不是它们的名称,您是否有
    data.table
    s或
    data.frame
    s?我之所以这样做,是因为您使用的是
    数据。frame
    术语来处理
    数据。tables
    ,即不使用
    :=
    它们是
    数据。tables
    由于无知,我想我使用的术语是错误的:(请随意更正!先更改到列表。这会产生以下错误消息(我很难解释,因为我不是数据专家。表):
    中的错误:
    :=
    (csat,recode(csat,1:5=0;6:7=1;NA=NA;):::=仅定义用于j,并且(目前)仅定义一次;即DT[I,col:=1L]和DT[,newcol:=sum(colB),by=colA]是可以的,但不是DT[I,col:=1L,不是DT[I]$col:=1L,而不是DT[,,{newcol1:=1L;newcol2:=2L}]。请参阅帮助(“:=”)。检查is.data.table(DT)是否为真。
    @roody我认为要获得进一步的帮助,请将您的示例制作成可复制的示例……请尝试阅读,感谢您链接到教程!非常有用,现在示例数据已添加到上面的帖子中。
    > dput(head(df))
    structure(list(respid = c(1499L, 433L, 2600L, 2282L, 1503L, 3304L
    ), csat = c(4L, 6L, NA, NA, 6L, 4L), status = c("Active", "Active", 
    "Active", "Active", "Active", "Active"), touch = c(2L, 3L, 2L, 
    3L, 2L, 2L)), .Names = c("CustomerId", "csat", "status", "touch"), class = c("data.table", 
    "data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x7f800301b778>)
    
    > dput(head(df2_r))
    structure(list(respid = c(6L, 5L, 149L, 147L, 270L, 145L), csat = c(4L, 
    NA, 6L, 7L, 7L, 4L), status = c("Active", "Lapsed/Churned", "Active", 
    "Active", "Active", "Active"), touch = c(3L, NA, 3L, 1L, 3L, 
    1L)), .Names = c("CustomerId", "csat", "status", "touch"), class = c("data.table", 
    "data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x7f800301b778>)
    
    > dput(head(df3))
    structure(list(respid = c(1713L, 1611L, 1630L, 1773L, 1391L, 
    1571L), csat = c(4L, 6L, 4L, 5L, 7L, 4L), status = c("Active", 
    "Active", "Active", "Active", "Active", "Active"), AGENCY_1 = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    )), .Names = c("CustomerId", "csat", "status", "AGENCY_1"), class = c("data.table", 
    "data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x7f800301b778>)
    
    out <- lapply( ll , function(x) x[ , csat := recode( csat , ,"1:5=0;6:7=1;NA=NA;" ) ][ , csat_vars , with = FALSE ] )
    
    df1 <- data.table( a = 1 , b = 2 , c = 3 )
    df2 <- data.table( a = 1 , b = 2 , c = 3 )
    ll <- list(df1,df2) 
    vars <- c( "a" , "c" )
    #  Recode column 'c' to 10, and then subset data.table to only columns 'a' and 'c'
    lapply( ll , function(x)  x[ , c := 10 ][ , vars , with = FALSE  ] )
    #[[1]]
    #   a  c
    #1: 1 10
    
    #[[2]]
    #   a  c
    #1: 1 10