【问题标题】:R : Create dataframe row per row with named and typed columnsR:每行创建数据框行,其中包含命名列和类型列
【发布时间】:2020-07-19 09:54:01
【问题描述】:

我想创建一个包含 4 列的数据框:字符、字符、数字、数字

为了可维护性,每行填充我的数据行,因此只保留 c("site1", "Site 1", 6.943890, -6.0557) 作为一行的数据。

这很有效,但很糟糕......我怎样才能让它更“R 美丽”?

S <- data.frame( t(data.frame(
  "s1" = c("None", "None", 0, 0 ),
  "s2" = c("site1", "Site 1", 6.943890, -6.0557),
  "s3" = c("site2", "Site 2", 43.943890, -3.055796)
) ) , stringsAsFactors = F)
colnames(S) <- c("id", "name", "lat", "lng")
S$lat <- as.double(S$lat)
S$lng <- as.double(S$lng)

这会产生一个正确的数据框,其中包含具有正确类型的命名列......

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果您想填写 data.frame,我不确定我是否理解您的问题 row by row 我会使用矩阵。

    library(magrittr)
    rnames = c("s1","s2","s3")
    values = c(c("None", "None", 0, 0 ),
               c("site1", "Site 1", 6.943890, -6.0557),
               c("site2", "Site 2", 43.943890, -3.055796))
    matrix(values,nrow = length(rnames),
           ncol = length(values)/length(rnames),
           byrow = T) %>% as.data.frame() -> S
    colnames(S) <- c("id", "name", "lat", "lng")
    
    S
    #>      id   name      lat       lng
    #> 1  None   None        0         0
    #> 2 site1 Site 1  6.94389   -6.0557
    #> 3 site2 Site 2 43.94389 -3.055796
    

    另一个选项是从列表构建数据框。 我认为这将更类似于您在 真实场景。

    options(stringsAsFactors = FALSE)
    
    
    df_list <- list(
      s1 = data.frame(id = "None", name = "None", lat = 0, lng = 0 ),
      s2 = data.frame(id = "site1", name =  "Site 1", lat = 6.943890,  lng = -6.0557),
      s3 = data.frame(id = "site2", name ="Site 2",lat = 43.943890,lng = -3.055796)
    ) 
    
    S = dplyr::bind_rows(df_list)
    colnames(S) <- c("id", "name", "lat", "lng")
    
    # i don't think u need this
    S$lat <- as.double(S$lat)
    S$lng <- as.double(S$lng)
    
    S
    #>      id   name      lat       lng
    #> 1  None   None  0.00000  0.000000
    #> 2 site1 Site 1  6.94389 -6.055700
    #> 3 site2 Site 2 43.94389 -3.055796
    

    正如其他人所说,这在 R 中并不常见,对于大型数据集,列表 选项可能会有点慢。通过列向量化是 大多数时候都是最佳选择。

    reprex package (v0.3.0) 于 2020-04-07 创建

    【讨论】:

      【解决方案2】:

      您可以使用type.convert 将数据转换为相应的类。

      str(S)
      #'data.frame':  3 obs. of  4 variables:
      # $ X1: chr  "None" "site1" "site2"
      # $ X2: chr  "None" "Site 1" "Site 2"
      # $ X3: chr  "0" "6.94389" "43.94389"
      # $ X4: chr  "0" "-6.0557" "-3.055796"
      
      S <- type.convert(S, as.is = TRUE)
      str(S)
      
      #'data.frame':  3 obs. of  4 variables:
      # $ X1: chr  "None" "site1" "site2"
      # $ X2: chr  "None" "Site 1" "Site 2"
      # $ X3: num  0 6.94 43.94
      # $ X4: num  0 -6.06 -3.06
      

      还有readr::type_convert(S) 做同样的事情。

      【讨论】:

      • 我可以摆脱多个 data.frame( t(data.frame( 通过使用更好的数据框定义吗?
      • @StéphaneV 您正在以逐行方式创建数据框。这不是标准的 R 方式,您应该按列进行。 S &lt;- data.frame(id = c('None', 'site1', 'site2'), name = c('None', 'Site1', 'Site2'), lat = c(0, 6.943890, 43.943890), long = c(0, -6.0557, -3.055796), stringsAsFactors = FALSE) 之后您无需显式更改其类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多