如何使用来自另一个数据帧的数据创建数据帧?

S2h*_*her 3 r dataframe

我不确定这在 R 中是否可行,但我有一个original_data包含一行和列的数据框,如下所示:

A  Ar   A1   A1r   B    Br   B1   B1r   C   Cr   C1   C1r......
0  0.1  0.5  0.1  0.1  0.6  0.7  1.2   1.4  1.2  1.5  1.8.....
Run Code Online (Sandbox Code Playgroud)
structure(list(A = 0L, Ar = 0.1, A1 = 0.5, A1r = 0.1, B = 0.1, 
    Br = 0.6, B1 = 0.7, B1r = 1.2, C = 1.4, Cr = 1.2, C1 = 1.5, 
    C1r = 1.8), row.names = c(NA, -1L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

解释一下什么A, Ar, A1, and A1r意思:

A :在访问 1 时进行测量的 ID。

Ar: 与访问 1 的 ID 相同A但复制

A1:与 相同的 ID A,但在访问 2 时进行测量。

A1r:与 ID 相同A,但测量值的重复A1

我想将其转换为如下所示的数据框:

ID   Visit   Replicate   Value
A     1         1         0
A     1         2         0.1
A     2         1         0.5
A     2         2         0.1
B     1         1         0.1
B     1         2         0.6
B     2         1         0.7
B     2         2         1.2
Run Code Online (Sandbox Code Playgroud)

我试图在 R 中做到这一点:

new_data_frame = data.frame(ID=character(0),Visit=integer(0),Replicate=integer(0),Value=integer(0))

for(i in 1:ncol(original_data))

{   #this is for the column "ID"

    new_data_frame$ID[i]=colnames(original_data)[i]

    #this is for the column "Replicate"
    if(grepl("r",colnames(original_data)[i])==True)
     {
         new_data_frame$Replicate[i]=2
     }
    else
    {
         new_data_frame$Replicate[i]=1
    }

    #this is for the column "Visit"
   if(grepl("1",colnames(original_data)[i])==True)
    {
      new_data_frame$Visit[i]=2
    }
   else
   {
    new_data_frame$Visit[i]=1
   }

#this is for the column "Value"
new_data_frame$Value[i]=original_data[,i]

}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Error in `$<-.data.frame`(`*tmp*`, "ID", value = NA_integer_) : 
  replacement has 1 row, data has 0
Run Code Online (Sandbox Code Playgroud)

如何修复我的代码以使其正常工作?

Ice*_*can 5

ID 是第一个字符,Visit 是 1 +(名称中的数字,如果没有数字则为 0),Replicate 为 1 +(如果名称以“r”结尾则为 1,否则为 0),Value 是未列出的值数据框。

df_vec <- unlist(df)

data.frame(
  ID = substr(names(df_vec), 1, 1),
  Visit = 1 + dplyr::coalesce(readr::parse_number(names(df_vec)), 0),
  Replicate = 1 + grepl('r$', names(df_vec)),
  Value = df_vec)

#     ID Visit Replicate Value
# A    A     1         1   0.0
# Ar   A     1         2   0.1
# A1   A     2         1   0.5
# A1r  A     2         2   0.1
# B    B     1         1   0.1
# Br   B     1         2   0.6
# B1   B     2         1   0.7
# B1r  B     2         2   1.2
# C    C     1         1   1.4
# Cr   C     1         2   1.2
# C1   C     2         1   1.5
# C1r  C     2         2   1.8
Run Code Online (Sandbox Code Playgroud)