我有一个列名称如下的数据集:“b1_BAcid_20_494”“b1_BAcid_20_382”“b1_BAcid_50_100”“b1_BAcid_50_360”“b1_BAcid_50_480”“b1_BAcid_50_750”“b1_monoP_0.2_240”“b1_ monoP_0.2_615”“b1_monoP_0.2_527”“b1_monoP_0.2_783”。
我正在尝试插入一个新行,其中包含每个列名称的两个下划线之间的数字,然后插入另一行仅包含复合名称。例如,对于“b1_BAcid_20_494”,需要一个值为“20”的行名称“concentration”,然后是一个值为“BAcid”的行名称“compound”。
这就是我的工作:
df <- rbind(df, NA) #The dataframe has 500 rows, and I attached a new row with NA as values
rownames(df)[501] <- "concentration" #Named the new row "concentration".
if(grepl("_0.2_", colnames(ddf))){
concentration <- 0.2
}else if (grepl("_10_", colnames(df))){
concentration <- 10
}else if (grepl("_100_", colnames(df))){
concentration <- 100
}else if (grepl("_2_", colnames(df))){
concentration <- 2
}else if (grepl("_20_", colnames(df))){
concentration <- 20
}else{
concentration <- 50
}
这些 if-else 语句对于“浓度”不起作用,我也想对“化合物”行做类似的事情。
在前面,添加一行复合名称会将所有非字符串列转换为字符串。例如,
str(rbind(data.frame(P=pi), data.frame(P="pi")))
# 'data.frame': 2 obs. of 1 variable:
# $ P: chr "3.14159265358979" "pi"
我们不能再使用
3.14159...
作为数字(无需工作)。假设你对此没意见......
我们可以使用
strcapture
提取化合物和浓度,然后将其转换为帧的行。
vec <- c("b1_BAcid_20_494", "b1_BAcid_20_382", "b1_BAcid_50_100", "b1_BAcid_50_360", "b1_BAcid_50_480", "b1_BAcid_50_750", "b1_monoP_0.2_240", "b1_monoP_0.2_615", "b1_monoP_0.2_527", "b1_monoP_0.2_783")
tmp <- strcapture(".*_(.*)_(.*)_.*", vec, list(compound="", conc=0))
tmp
# compound conc
# 1 BAcid 20.0
# 2 BAcid 20.0
# 3 BAcid 50.0
# 4 BAcid 50.0
# 5 BAcid 50.0
# 6 BAcid 50.0
# 7 monoP 0.2
# 8 monoP 0.2
# 9 monoP 0.2
# 10 monoP 0.2
newrows <- setNames(data.frame(t(tmp)), vec)
newrows
# b1_BAcid_20_494 b1_BAcid_20_382 b1_BAcid_50_100 b1_BAcid_50_360 b1_BAcid_50_480 b1_BAcid_50_750 b1_monoP_0.2_240 b1_monoP_0.2_615 b1_monoP_0.2_527 b1_monoP_0.2_783
# compound BAcid BAcid BAcid BAcid BAcid BAcid monoP monoP monoP monoP
# conc 20.0 20.0 50.0 50.0 50.0 50.0 0.2 0.2 0.2 0.2
您可以在现有框架中添加
rbind
新行,假设这些是原始数据中的唯一列。如果您还有我们的 vec
中未提及的其他列,那么您有以下选择:
newrows
中创建尚未包含的列,并具有一些合理的值(NA
、""
、0
,任何对您的数据有意义的值)。dplyr::bind_rows(orig, newrows)
或 data.table::rbindlist(list(orig, newrows), fill=TRUE, use.names=TRUE)
,因为两者都可以解决 orig
框架中未包含的名称。