我不确定这在 R 中是否可行,但我有一个original_data包含一行和列的数据框,如下所示:
Run Code Online (Sandbox Code Playgroud)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.....
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)
如何修复我的代码以使其正常工作?
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)