插入一个新行,其中的值从列名称中提取

问题描述 投票:0回答:1

我有一个列名称如下的数据集:“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 语句对于“浓度”不起作用,我也想对“化合物”行做类似的事情。

r row grepl
1个回答
0
投票

在前面,添加一行复合名称会将所有非字符串列转换为字符串。例如,

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
中未提及的其他列,那么您有以下选择:

  1. 以正确的顺序在此
    newrows
    中创建尚未包含的列,并具有一些合理的值(
    NA
    ""
    0
    ,任何对您的数据有意义的值)。
  2. 使用
    dplyr::bind_rows(orig, newrows)
    data.table::rbindlist(list(orig, newrows), fill=TRUE, use.names=TRUE)
    ,因为两者都可以解决
    orig
    框架中未包含的名称。
© www.soinside.com 2019 - 2024. All rights reserved.