在 R 中组合向量和列表
Combine vector and list in R
我正在使用 strsplit 拆分数据集中的一列,并希望将一列映射到拆分数据。
这是一个示例数据集:
https://drive.google.com/file/d/1jtrn6Htezz6iRhJN0HaxXowT5JZW52ai/view?usp=sharing
我的代码如下:
library(readr)
df <- read_csv("sample for community.csv", col_names = FALSE)[,1:2]
x<-strsplit(df$X2, '\n')
y5<-x[lapply(x, length) ==5]
y4<-x[lapply(x, length) ==4]
y3<-x[lapply(x, length) ==3]
p5<-data.frame(unlist(lapply(y5, `[[`, 1)),unlist(lapply(y5, `[[`, 2)),unlist(lapply(y5, `[[`, 3)),unlist(lapply(y5, `[[`, 4)),unlist(lapply(y5, `[[`, 5)))
p4<-data.frame(unlist(lapply(y4, `[[`, 1)),unlist(lapply(y4, `[[`, 2)),unlist(lapply(y4, `[[`, 3)),unlist(lapply(y4, `[[`, 4)))
p3<-data.frame(unlist(lapply(y3, `[[`, 1)),unlist(lapply(y3, `[[`, 2)),unlist(lapply(y3, `[[`, 3)))
p5[,5]<-NULL
p3[,4]<-rep("NA")
colnames(p5)<-c("X1","X2","X3","X4")
colnames(p4)<-c("X1","X2","X3","X4")
colnames(p3)<-c("X1","X2","X3","X4")
final<-rbind(p5,p4,p3)
如您所见,由于某些数据的行数不同,行的顺序发生了变化。
我希望将第一列合并到最终数据集,但不知道如何操作。
在真实数据集中,不可能通过匹配字符串来匹配(例如,将 "String1" 与包含 "String1" 的列匹配)
非常感谢所有帮助。
谢谢,
马特
这是一个基本的 R 解决方案。可能有更聪明的方法来做到这一点。
library(readr)
df <- read_csv("sample for community.csv", col_names = FALSE)[,1:2]
x<-strsplit(df$X2, '\n')
lmax= max(sapply(x,length))
p=t(sapply(x, function(x)c(x,rep(NA,lmax-length(x)))))
p=p[,-5]
colnames(p)<-c("X1","X2","X3","X4")
final=as.data.frame(p)
和tidyverse
library(tidyverse)
df %>%
separate(X2, into = paste0("X2_", 1:4), sep="\s*\n\s*")
# A tibble: 5 x 5
# X1 X2_1 X2_2 X2_3 X2_4
# <chr> <chr> <chr> <chr> <chr>
#1 String1 String1Line1 String1Line2 String1Line3 String1Line4
#2 String2 String2Line1 String2Line2 String2Line3 String2Line4
#3 String3 String3Line1 String3Line2 String3Line3 ""
#4 String4 String4Line1 String4Line2 String4Line3 String4Line4
#5 String5 String5Line1 String5Line2 String5Line3 String5Line4
我正在使用 strsplit 拆分数据集中的一列,并希望将一列映射到拆分数据。
这是一个示例数据集:
https://drive.google.com/file/d/1jtrn6Htezz6iRhJN0HaxXowT5JZW52ai/view?usp=sharing
我的代码如下:
library(readr)
df <- read_csv("sample for community.csv", col_names = FALSE)[,1:2]
x<-strsplit(df$X2, '\n')
y5<-x[lapply(x, length) ==5]
y4<-x[lapply(x, length) ==4]
y3<-x[lapply(x, length) ==3]
p5<-data.frame(unlist(lapply(y5, `[[`, 1)),unlist(lapply(y5, `[[`, 2)),unlist(lapply(y5, `[[`, 3)),unlist(lapply(y5, `[[`, 4)),unlist(lapply(y5, `[[`, 5)))
p4<-data.frame(unlist(lapply(y4, `[[`, 1)),unlist(lapply(y4, `[[`, 2)),unlist(lapply(y4, `[[`, 3)),unlist(lapply(y4, `[[`, 4)))
p3<-data.frame(unlist(lapply(y3, `[[`, 1)),unlist(lapply(y3, `[[`, 2)),unlist(lapply(y3, `[[`, 3)))
p5[,5]<-NULL
p3[,4]<-rep("NA")
colnames(p5)<-c("X1","X2","X3","X4")
colnames(p4)<-c("X1","X2","X3","X4")
colnames(p3)<-c("X1","X2","X3","X4")
final<-rbind(p5,p4,p3)
如您所见,由于某些数据的行数不同,行的顺序发生了变化。
我希望将第一列合并到最终数据集,但不知道如何操作。
在真实数据集中,不可能通过匹配字符串来匹配(例如,将 "String1" 与包含 "String1" 的列匹配)
非常感谢所有帮助。
谢谢,
马特
这是一个基本的 R 解决方案。可能有更聪明的方法来做到这一点。
library(readr)
df <- read_csv("sample for community.csv", col_names = FALSE)[,1:2]
x<-strsplit(df$X2, '\n')
lmax= max(sapply(x,length))
p=t(sapply(x, function(x)c(x,rep(NA,lmax-length(x)))))
p=p[,-5]
colnames(p)<-c("X1","X2","X3","X4")
final=as.data.frame(p)
和tidyverse
library(tidyverse)
df %>%
separate(X2, into = paste0("X2_", 1:4), sep="\s*\n\s*")
# A tibble: 5 x 5
# X1 X2_1 X2_2 X2_3 X2_4
# <chr> <chr> <chr> <chr> <chr>
#1 String1 String1Line1 String1Line2 String1Line3 String1Line4
#2 String2 String2Line1 String2Line2 String2Line3 String2Line4
#3 String3 String3Line1 String3Line2 String3Line3 ""
#4 String4 String4Line1 String4Line2 String4Line3 String4Line4
#5 String5 String5Line1 String5Line2 String5Line3 String5Line4