我正在尝试向data.frame添加新列(插槽),具体取决于id的行值。简短的代表性数据如下。
id Cap Rs R_inv
257 464A485SSEE3 1.41E-10 736665.125 1.36E-06
258 464A485SSEE3 1.30E-10 364822.6875 2.74E-06
289 464A485TSEB2 1.44E-10 111996.1016 8.93E-06
290 464A485TSEB2 1.33E-10 108541 9.21E-06
我认为我们可以编写一个循环函数来添加新列。但我希望学习简单的功能,如cbind或raw $ slot< - ???
答案 0 :(得分:1)
尝试
raw$slot <- with(raw, paste0("slot",as.numeric(factor(id))))
raw
# id Cap Rs R_inv slot
#257 464A485SSEE3 1.41e-10 736665.1 1.36e-06 slot1
#258 464A485SSEE3 1.30e-10 364822.7 2.74e-06 slot1
#289 464A485TSEB2 1.44e-10 111996.1 8.93e-06 slot2
#290 464A485TSEB2 1.33e-10 108541.0 9.21e-06 slot2
或者如果数据集按id
排序,您也可以
raw$slot <- paste0("slot",cumsum(c(TRUE,raw$id[-1]!=raw$id[-nrow(raw)])))
如果您需要一些自定义标签,可以将id
转换为factor
(如果不是)并指定您想要的labels
raw$slot <- with(raw, as.character(factor(id, labels=c('split6', 'split9'))) )
raw$slot
#[1] "split6" "split6" "split9" "split9"
或者只需将numeric
转换为factor
即可使用numeric
索引,并在该索引上使用names
的向量。在这里,您需要在执行此操作之前了解级别的顺序。
with(raw, c('split6', 'split9')[as.numeric(factor(id))])
#[1] "split6" "split6" "split9" "split9"
raw <- structure(list(id = c("464A485SSEE3", "464A485SSEE3", "464A485TSEB2",
"464A485TSEB2"), Cap = c(1.41e-10, 1.3e-10, 1.44e-10, 1.33e-10
), Rs = c(736665.125, 364822.6875, 111996.1016, 108541), R_inv = c(1.36e-06,
2.74e-06, 8.93e-06, 9.21e-06)), .Names = c("id", "Cap", "Rs",
"R_inv"), class = "data.frame", row.names = c("257", "258", "289", "290"))
答案 1 :(得分:1)
如果你有一个长桌,可能会考虑使用“dplyr”包的“join”功能。
# First, here is your data:
df <- structure(list(id = structure(c(1L, 1L, 2L, 2L), .Label = c("464A485SSEE3",
"464A485TSEB2"), class = "factor"), Cap = c(1.41e-10, 1.3e-10,
1.44e-10, 1.33e-10), Rs = c(736665.125, 364822.6875, 111996.1016,
108541), R_inv = c(1.36e-06, 2.74e-06, 8.93e-06, 9.21e-06)), .Names = c("id",
"Cap", "Rs", "R_inv"), class = "data.frame", row.names = c("257",
"258", "289", "290"))
# id Cap Rs R_inv
# 257 464A485SSEE3 1.41e-10 736665.1 1.36e-06
# 258 464A485SSEE3 1.30e-10 364822.7 2.74e-06
# 289 464A485TSEB2 1.44e-10 111996.1 8.93e-06
# 290 464A485TSEB2 1.33e-10 108541.0 9.21e-06
# Then create a matching table similar to below:
match_table <- structure(list(id = structure(1:2, .Label = c("464A485SSEE3",
"464A485TSEB2"), class = "factor"), slot_no = structure(1:2, .Label = c("slot_1",
"slot_2"), class = "factor")), .Names = c("id", "slot_no"), class = "data.frame", row.names = c(NA,
-2L))
# id slot_no
# 1 464A485SSEE3 slot_1
# 2 464A485TSEB2 slot_2
# Do joining
library(dplyr)
left_join(df, match_table)
# id Cap Rs R_inv slot_no
# 1 464A485SSEE3 1.41e-10 736665.1 1.36e-06 slot_1
# 2 464A485SSEE3 1.30e-10 364822.7 2.74e-06 slot_1
# 3 464A485TSEB2 1.44e-10 111996.1 8.93e-06 slot_2
# 4 464A485TSEB2 1.33e-10 108541.0 9.21e-06 slot_2