绑定具有不同行数的列
bind columns with different number of rows
我想创建一个迭代,它接受一个列表(它是另一个数据框的列)并将其作为列添加到当前数据框。但列的长度不相等。所以,我想生成 NA 作为不匹配的行。
seq_actions=as.data.frame(x = NA)
for(i in 1:20){
temp_seq=another_df$c1[some conditions]
seq_actions=cbind(temp_seq,seq_actions)
}
为简化起见,假设我有
df
1 3
3 4
2 2
将 5,6 的列表作为新列添加到 df,所以我想要:
df
1 3 5
3 4 6
2 2 NA
另一个添加列表是 7 7 7 8,所以我的 df 将是:
df
1 3 5 7
3 4 6 7
2 2 NA 7
NA NA NA 8
我该怎么做?
如果您知道 df 的最大可能大小,以及要追加的总列数,您可以提前创建所有 NA 值的 df,并根据其长度填充一列。这将使所有内容在其长度之后仍为 NA。
例如
max_col_num <- 20
max_col_size <- 10 #This could be the number of rows in the largest dataframe you have
df <- as.data.frame(matrix(ncol = max_col_num, nrow = max_col_size))
for(i in 1:20){
temp_seq=another_df$c1[some conditions]
df[c(1:length(temp_seq), i] <- temp_seq
}
这只有在您更新可能的行数和列数的情况下才有效。
我认为最好的办法是编写一个基于数据框 nrow
和 vector/list 的 length
的自定义函数。
一旦这样的函数可以写成:
#Function to add vector as column
addToDF <- function(df, v){
nRow <- nrow(df)
lngth <- length(v)
if(nRow > lngth){
length(v) <- nRow
}else if(nRow < lngth){
df[(nRow+1):lngth, ] <- NA
}
cbind(df,v)
}
让我们用OP提供的data.frame测试上面的功能。
df <- data.frame(A= c(1,3,2), B = c(3, 4, 2))
v <- c(5,6)
w <-c(7,7,8,9)
addToDF(df, v)
# A B v
# 1 1 3 5
# 2 3 4 6
# 3 2 2 NA
addToDF(df, w)
# A B v
# 1 1 3 7
# 2 3 4 7
# 3 2 2 8
# 4 NA NA 9
这是一种方法。每当您组合数据框并且未找到匹配项时(例如,如果您在 1 个数据框中的值少于另一个数据框中的值),设计的合并功能将添加 NA 值。
如果您假设要根据行号匹配数据框(哪些行放在一起),则只需将行号输出为数据框中的一列。然后合并该列。合并将自动添加您想要的 NA 值并处理数据帧具有不同行数的事实。
#test data frame 1
a <- c(1, 3, 2)
b <- c(3, 4, 2)
dat <- as.data.frame(cbind(a, b))
#test data frame 2 (this one has fewer rows than the first data frame)
c <- c(5, 6)
dat.new <- as.data.frame(c)
#add column to each data frame with row number
dat$number <- row.names(dat)
dat.new$number <- row.names(dat.new)
#merge data frames
#"all = TRUE" will mean that NA values will be added whenever there is no match
finaldata <- merge(dat, dat.new, by = "number", all = TRUE)
根据 MKRs 的回应,如果你想为新添加的列添加一个特定的名称,你可以尝试:
addToDF <- function(df, v, col_name){
nRow <- nrow(df)
lngth <- length(v)
if(nRow > lngth){
length(v) <- nRow
}else if(nRow < lngth){
df[(nRow+1):lngth, ] <- NA
}
df_new<-cbind(df,v)
colnames(df_new)[ncol(df_new)]=col_name
return(df_new)
}
其中 col_name
是新添加的列。
我想创建一个迭代,它接受一个列表(它是另一个数据框的列)并将其作为列添加到当前数据框。但列的长度不相等。所以,我想生成 NA 作为不匹配的行。
seq_actions=as.data.frame(x = NA)
for(i in 1:20){
temp_seq=another_df$c1[some conditions]
seq_actions=cbind(temp_seq,seq_actions)
}
为简化起见,假设我有
df
1 3
3 4
2 2
将 5,6 的列表作为新列添加到 df,所以我想要:
df
1 3 5
3 4 6
2 2 NA
另一个添加列表是 7 7 7 8,所以我的 df 将是:
df
1 3 5 7
3 4 6 7
2 2 NA 7
NA NA NA 8
我该怎么做?
如果您知道 df 的最大可能大小,以及要追加的总列数,您可以提前创建所有 NA 值的 df,并根据其长度填充一列。这将使所有内容在其长度之后仍为 NA。
例如
max_col_num <- 20
max_col_size <- 10 #This could be the number of rows in the largest dataframe you have
df <- as.data.frame(matrix(ncol = max_col_num, nrow = max_col_size))
for(i in 1:20){
temp_seq=another_df$c1[some conditions]
df[c(1:length(temp_seq), i] <- temp_seq
}
这只有在您更新可能的行数和列数的情况下才有效。
我认为最好的办法是编写一个基于数据框 nrow
和 vector/list 的 length
的自定义函数。
一旦这样的函数可以写成:
#Function to add vector as column
addToDF <- function(df, v){
nRow <- nrow(df)
lngth <- length(v)
if(nRow > lngth){
length(v) <- nRow
}else if(nRow < lngth){
df[(nRow+1):lngth, ] <- NA
}
cbind(df,v)
}
让我们用OP提供的data.frame测试上面的功能。
df <- data.frame(A= c(1,3,2), B = c(3, 4, 2))
v <- c(5,6)
w <-c(7,7,8,9)
addToDF(df, v)
# A B v
# 1 1 3 5
# 2 3 4 6
# 3 2 2 NA
addToDF(df, w)
# A B v
# 1 1 3 7
# 2 3 4 7
# 3 2 2 8
# 4 NA NA 9
这是一种方法。每当您组合数据框并且未找到匹配项时(例如,如果您在 1 个数据框中的值少于另一个数据框中的值),设计的合并功能将添加 NA 值。
如果您假设要根据行号匹配数据框(哪些行放在一起),则只需将行号输出为数据框中的一列。然后合并该列。合并将自动添加您想要的 NA 值并处理数据帧具有不同行数的事实。
#test data frame 1
a <- c(1, 3, 2)
b <- c(3, 4, 2)
dat <- as.data.frame(cbind(a, b))
#test data frame 2 (this one has fewer rows than the first data frame)
c <- c(5, 6)
dat.new <- as.data.frame(c)
#add column to each data frame with row number
dat$number <- row.names(dat)
dat.new$number <- row.names(dat.new)
#merge data frames
#"all = TRUE" will mean that NA values will be added whenever there is no match
finaldata <- merge(dat, dat.new, by = "number", all = TRUE)
根据 MKRs 的回应,如果你想为新添加的列添加一个特定的名称,你可以尝试:
addToDF <- function(df, v, col_name){
nRow <- nrow(df)
lngth <- length(v)
if(nRow > lngth){
length(v) <- nRow
}else if(nRow < lngth){
df[(nRow+1):lngth, ] <- NA
}
df_new<-cbind(df,v)
colnames(df_new)[ncol(df_new)]=col_name
return(df_new)
}
其中 col_name
是新添加的列。