[英]Extracting Data from Vector Elements in R
我試圖寫一個R腳本來解析來自csv文件單元格的有序數字對。 這是CSV文件的前幾行:
Test1, Test2, Test3
Label1, [(1, 2), (5, 6), (9, 10)], High
Label2, [(5, 9), (6, 10)], Low
Label3, [(0, 5)], High
請注意,第二列是運行Python腳本得到的元組列表。 我編寫了一個R腳本,使用read.csv將csv文件讀取為表格,然后從每一列創建向量。 然后,我希望它從列2的每個向量元素/單元格中讀取每個有序對(元組),並將它們用於繪制矩形的開始和結束x值。 但是我無法從vector元素解析單個有序對(元組)。 不管我做什么,R仍然將向量元素視為一個對象,而不是數組或列表。
這是R代碼:
table1 <- read.csv("data.csv",header=TRUE,sep=",")
val1 <- paste(table1[,1])
val2 <- paste(table1[,2]) # First data row is [(1, 2), (5, 6), (9, 10)]
val3 <- paste(table1[,3])
nrows = length(val1)
for (i in 1:nrows) {
rects <- val2[i] # rects <- [(1, 2), (5, 6), (9, 10)]
nval <- length(rects) # Want nval to be 3
if (nval > 0) {
for (j in 1:nval) {
bounds <- rects[j] # Want bounds to be (1, 2), then (5, 6), then (9, 10)
start <- bounds[1] # Want start to be 1, 5, and then 9
stop <- bounds[2] # Want stop to be 2, 6, and then 10
w <- stop - start # w should be 1
vpp <- start + w/2 # vpp will be 1.5, 5.5, and then 9.5
pushViewport(vp)
grid.rect(x=0.5, y=0.5, width=w, height=0.5, gp=gpar(fill="violet"))
upViewport()
}
}
}
我不確定我100%理解您希望最終輸出是什么,但是這是一種以這樣的數據幀結束的方法,其中x值的開始和結束是分開的:
Test1 Test3 X1 X2
1 Label1 High 1 2
2 Label1 High 5 6
3 Label1 High 9 10
4 Label2 Low 5 9
5 Label2 Low 6 10
6 Label3 High 0 5
我創建了數據框,但必須手動在粘貼的文本中替換分號。
df <- read.table(text = "Test1; Test2; Test3
Label1; [(1, 2), (5, 6), (9, 10)]; High
Label2; [(5, 9), (6, 10)]; Low
Label3; [(0, 5)]; High", sep = ";", header = TRUE, stringsAsFactors = FALSE)
首先在"), "
進行拆分"), "
這應該混亂地拆分每個點列表。 然后將每個元組分成兩列,並刪除所有多余的括號等。
splits <- strsplit(as.character(df$Test2), "), ")
# split up list of tuples
df2 <- data.frame(Test1 = rep(df$Test1, lapply(splits, length)),
Test3 = rep(df$Test3, lapply(splits, length)),
Test2 = unlist(splits), stringsAsFactors = FALSE)
# split tuples into two columns
df3 <- cbind(df2[, c("Test1", "Test3")],
data.frame(do.call("rbind", strsplit(df2$Test2, ",", fixed = TRUE))))
# remove parens etc. and convert to numeric
df3$X1 <- as.numeric(gsub("[^[:digit:]]", "", df3$X1))
df3$X2 <- as.numeric(gsub("[^[:digit:]]", "", df3$X2))
這將創建上面顯示的數據框,並允許您繪制矩形以進行如下操作(將隨機y值添加到數據框):
library('dplyr')
library('ggplot2')
set.seed(10)
df4 <- df3 %>%
do(mutate(., ymin = sample(10, nrow(.)))) %>% # random y values for plotting
mutate(ymax = ymin + 1)
ggplot(df4, aes(xmin = X1, xmax = X2, ymin = ymin, ymax = ymax)) +
geom_rect()
看起來像:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.