我不确定在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.....
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")
解释A, Ar, A1, and A1r
的含义:
[A
:在访问1时进行测量的ID。
Ar
:与A
相同的ID,但来自Visit1的副本
[A1
:与A
相同的ID,但在访问2时进行了测量。
A1r
:与A
相同的ID,但是测量值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
我尝试在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]
}
我收到一个错误:
Error in `$<-.data.frame`(`*tmp*`, "ID", value = NA_integer_) :
replacement has 1 row, data has 0
如何修复我的代码以使其正常工作?
ID为第一个字符,Visit为1 +(名称中的数字;如果没有数字,则为0),Replicate为1 +(如果名称以'r'结尾,则为1,否则为0),并且Value为以下值:未列出的data.frame。
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
这里是使用tidyverse软件包的一种解决方案。基本上,这会将您的数据框转换为长格式,并使用(旧的)列名提取所需的信息。现在,这假设只能有一个副本,但是可以有两个以上的访问。如果只能进行两次访问,将很容易简化Visit
变量的创建:
library(tidyr)
library(dplyr)
df1 %>%
pivot_longer(everything()) %>%
transmute(ID = gsub("(\\d+|r)", "", name),
Visit = ifelse(grepl("\\d", name), 1 + as.integer(gsub("\\D", "", name)), 1),
Replicate = ifelse(grepl("r", name, fixed = T), 2, 1))
# A tibble: 12 x 3
ID Visit Replicate
<chr> <dbl> <dbl>
1 A 1 1
2 A 1 2
3 A 2 1
4 A 2 2
5 B 1 1
6 B 1 2
7 B 2 1
8 B 2 2
9 C 1 1
10 C 1 2
11 C 2 1
12 C 2 2
这是使用stack
将数据转换为长格式,然后使用data.table
的解决方案:
library(data.table)
df <- stack(df)
setDT(df)[, ID := substr(ind, 1, 1)][, Visit := ifelse(grepl("\\d", ind) == T, as.numeric(gsub("[^0-9.]", "", ind)) + 1, 1)][, Replicate := ifelse(grepl("r", ind) == T, 2, 1)][, c("ID", "Visit", "Replicate", "values")]
# ID Visit Replicate values
#1: A 1 1 0.0
#2: A 1 2 0.1
#3: A 2 1 0.5
#4: A 2 2 0.1
#5: B 1 1 0.1
#6: B 1 2 0.6
#7: B 2 1 0.7
#8: B 2 2 1.2
#9: C 1 1 1.4
#10: C 1 2 1.2
#11: C 2 1 1.5
#12: C 2 2 1.8
我是新手。但是我尝试了这种方法,并且对我有用。是的,您可以这样:
New_data <- data.frame("variable1" = old$variable1,
"variable2" = old$variable2,
"variable3" = old$variable3)