R---不同长度向量合并为data.frame

安利好朋友写的美食文牛排到底要点几分熟,我觉得写得真不错 ,有兴趣的朋友们可以点开看看哟!

不同长度向量合并为data.frame

># 构造列表
> (a_list = list(
+   c(1, 1, 2, 5, 14, 42), 
+   month.abb,
+   c(1, 1, 2, 5, 14, 42, 22,88, 0)))
# [[1]]
# [1]  1  1  2  5 14 42
# 
# [[2]]
#  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
# 
# [[3]]
# [1]  1  1  2  5 14 42 22 88  0

> 
> do.call(cbind, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list))))
#       [,1] [,2]  [,3]
#  [1,] "1"  "Jan" "1" 
#  [2,] "1"  "Feb" "1" 
#  [3,] "2"  "Mar" "2" 
#  [4,] "5"  "Apr" "5" 
#  [5,] "14" "May" "14"
#  [6,] "42" "Jun" "42"
#  [7,] NA   "Jul" "22"
#  [8,] NA   "Aug" "88"
#  [9,] NA   "Sep" "0" 
# [10,] NA   "Oct" NA  
# [11,] NA   "Nov" NA  
# [12,] NA   "Dec" NA  
> 
> #当给合并后的data.frame每一列的命名时,则必须使用函数"cbind.data.frame"
> setNames(do.call(cbind.data.frame, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list)))), paste0("V", 1:3))
#    V1  V2 V3
# 1   1 Jan  1
# 2   1 Feb  1
# 3   2 Mar  2
# 4   5 Apr  5
# 5  14 May 14
# 6  42 Jun 42
# 7  NA Jul 22
# 8  NA Aug 88
# 9  NA Sep  0
# 10 NA Oct NA
# 11 NA Nov NA
# 12 NA Dec NA
> 
> #当列表中的元素已被命名,则既可使用"cbind.data.frame",也可使用"cbind"
> names(a_list) = c("cat", "months", "dog")
> do.call(cbind, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list))))
#       cat  months dog 
#  [1,] "1"  "Jan"  "1" 
#  [2,] "1"  "Feb"  "1" 
#  [3,] "2"  "Mar"  "2" 
#  [4,] "5"  "Apr"  "5" 
#  [5,] "14" "May"  "14"
#  [6,] "42" "Jun"  "42"
#  [7,] NA   "Jul"  "22"
#  [8,] NA   "Aug"  "88"
#  [9,] NA   "Sep"  "0" 
# [10,] NA   "Oct"  NA  
# [11,] NA   "Nov"  NA  
# [12,] NA   "Dec"  NA  

cbind 与cbind.data.frame 区别

> a <- 1:4
> b <- c("car", "bus", "train", "bike")
> ab <- cbind(a,b); ab
#      a   b      
# [1,] "1" "car"  
# [2,] "2" "bus"  
# [3,] "3" "train"
# [4,] "4" "bike" 
> class(ab)
# [1] "matrix"
> typeof(ab)
# [1] "character"
> 
> ab <- cbind.data.frame(a,b); ab
#   a     b
# 1 1   car
# 2 2   bus
# 3 3 train
# 4 4  bike
> class(ab)
# [1] "data.frame"
> typeof(ab)
# [1] "list"

函数简单说明

setNames(object = nm, nm)


do.call(what, args, quote = FALSE, envir = parent.frame())
###do.call constructs and executes a function call from a name or a function and a list of arguments to be passed to it.


lapply(X, FUN, …)
###lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X.

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码使用了 R 语言中的 data.table 包进行数据处理操作。它对一个名为 `data` 的数据框进行了一系列变换操作,下是对每个操作简要说明: 1. `library(data.table)`:导入 data.table 包。 2. `setDT(data)`:将数据框 `data` 转换为 data.table 格式,以便使用 data.table 提供的高效操作。 3. `all_ids <- sort(unique(c(data$start.station.id, data$end.station.id)))`:将 `start.station.id` 和 `end.station.id` 列的所有唯一值合并,并按升序排序,存储在 `all_ids` 变量中。 4. `id_labels <- 1:length(all_ids)`:生成一个长度为 `all_ids` 的向量,其中每个元素的值为对应位置的索引值。 5. `names(id_labels) <- all_ids`:将 `all_ids` 中的唯一值作为 `id_labels` 向量的名称。 6. `data[, startlabel := id_labels[match(start.station.id, all_ids)]]`:使用 `match` 函数将 `start.station.id` 列的值与 `all_ids` 向量进行匹配,返回匹配到的索引值,然后使用 `id_labels` 向量获取对应的标签,并将结果赋给 `startlabel` 列。 7. `data[, endlabel := id_labels[match(end.station.id, all_ids)]]`:使用 `match` 函数将 `end.station.id` 列的值与 `all_ids` 向量进行匹配,返回匹配到的索引值,然后使用 `id_labels` 向量获取对应的标签,并将结果赋给 `endlabel` 列。 8. `data <- as.data.frame(data)`:将数据框 `data` 转换回 data.frame 格式。 请注意,这只是代码的解释,并非实际运行该代码的环境。如果你想运行该代码,请确保已经安装了 data.table 包,并且数据框 `data` 中包含了对应的列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值