【问题标题】:How to write a loop or using lapply to create some new variables in R如何编写循环或使用 lapply 在 R 中创建一些新变量
【发布时间】:2017-02-24 06:37:30
【问题描述】:

我有数据框,我想创建一些新变量并更新旧变量,但有时变量的长度太多,我不知道如何放入循环或使用 mapply 或 lapply。

df <- data.frame(x=c("A","A","A,S"),
                 y=c("12","12,4","10"),
                 z=c("String,Text","Avoid","Use"))
> df
    x    y           z
1   A   12 String,Text
2   A 12,4       Avoid
3 A,S   10         Use

我创建了一些新变量:

df$x_sub <- substring(sub("^[^,]*", "",df$x),2)
df$x     <- sub("\\,.*", "",df$x)
df$y_sub <- substring(sub("^[^,]*", "",df$y),2)
df$y     <- sub("\\,.*", "",df$y)
df$z_sub <- substring(sub("^[^,]*", "",df$z),2)
df$z     <- sub("\\,.*", "",df$z)

输出是正确的,但是如果我有 10 个变量,我需要做些什么来节省时间

  x  y      z x_sub y_sub z_sub
1 A 12 String              Text
2 A 12  Avoid           4      
3 A 10    Use     S            

【问题讨论】:

    标签: r lapply mapply


    【解决方案1】:

    我们可以使用str_extract 来做到这一点

    library(stringr)
    df1 <- df
    df1[] <- lapply(df, function(x) type.convert(str_extract(x, "^[^,]+"), as.is = TRUE))
    
    df1[paste0(names(df1), "_sub")] <-  lapply(df, function(x) 
                       type.convert(str_extract(x, "(?<=,)[^,]+"), as.is = TRUE))
    df1
    #  x  y      z x_sub y_sub z_sub
    #1 A 12 String  <NA>    NA  Text
    #2 A 12  Avoid  <NA>     4  <NA>
    #3 A 10    Use     S    NA  <NA>
    

    或者另一个选项是cSplit

    library(splitstackshape)
    cSplit(df, names(df), ",")
    #   x_1 x_2 y_1 y_2    z_1  z_2
    #1:   A  NA  12  NA String Text
    #2:   A  NA  12   4  Avoid   NA
    #3:   A   S  10  NA    Use   NA
    

    【讨论】:

    • for(n in names(df)){ df[[paste0(n, "_sub")]]
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多