R 因为循环行为怪异

R 因为循环行为怪异,r,for-loop,R,For Loop,我有两个数据帧: df_1 <- data.frame(c("a_b", "a_c", "a_d")) df_2 <- data.frame(matrix(ncol = 2)) 但我得到的却是: col1 col2 a b a c a d a c NA NA a d 我一定是做错了什么事,但我想不出来。 我还想使用apply(或类似的东西,但我对R很陌生,对apply家族不太熟悉) 谢谢你的帮助!另一种方法是 df_1 <-

我有两个数据帧:

df_1 <- data.frame(c("a_b", "a_c", "a_d"))
df_2 <- data.frame(matrix(ncol = 2))
但我得到的却是:

col1  col2
a     b
a     c
a     d
a     c
NA    NA
a     d
我一定是做错了什么事,但我想不出来。 我还想使用apply(或类似的东西,但我对R很陌生,对apply家族不太熟悉)

谢谢你的帮助!

另一种方法是

df_1 <- data.frame(col1 = c("a_b", "a_c", "a_d"))

df_2 <- as.data.frame(do.call(rbind, strsplit(as.character(df_1$col1), split = "_", fixed = TRUE)))
df_2[rep(1:nrow(df_2), each = 2), ]

    V1 V2
1    a  b
1.1  a  b
2    a  c
2.1  a  c
3    a  d
3.1  a  d

df_1好的,我本周开始学习R,但是如果您想要呈现结果,您可以将您的代码用于此修复:

for (i in (1:(length(df_1[,1])))){
    for (j in (1:2)) {
        df_2[(i-1)*2+j,] <- str_split_fixed(df_1[i,1], "_", 2)
    }
}
for(i in(1:(长度(df_1[,1]))){
对于(j in(1:2)){

df_2[(i-1)*2+j,]这将是两个答案的组合。使用
cSplit
我们将列按
拆分,然后每行重复两次。假设您的列名为
V1

library(splitstackshape)
df_2 <- cSplit(df_1, "V1", "_")
df_2[rep(seq_len(nrow(df_2)),each =  2), ]

#   V1_1 V1_2
#1:    a    b
#2:    a    b
#3:    a    c
#4:    a    c
#5:    a    d
#6:    a    d
数据

df_1 <- data.frame(V1 = c("a_b", "a_c", "a_d"))

dfu 1我们可以将
cSplit
数据一起使用

library(splitstackshape)
cSplit(df_1, 'col1', '_')[rep(seq_len(.N), each =2)]
#   col1_1 col1_2
#1:      a      b
#2:      a      b
#3:      a      c
#4:      a      c
#5:      a      d
#6:      a      d

或者另一个选项是
tidyverse

library(tidyverse)
separate(df_1, col1, into=c("col_1", "col_2")) %>%
                              map_df(~rep(., each = 2))
# A tibble: 6 × 2
#   col_1 col_2
#  <chr> <chr>
#1     a     b
#2     a     b
#3     a     c
#4     a     c
#5     a     d
#6     a     d
库(tidyverse)
分离(df_1,col1,into=c(“col_1”,“col_2”))%>%
map_df(~rep(,每个=2))
#一个tibble:6×2
#第1列第2列
#   
#1 a b
#2 a b
#3 a c
#4 a c
#公元5年
#公元6年
注:两个答案都是一行

数据
df_1我试图发布一个在发布后立即找到的解决方案,但被误解并被删除:

“有时发布问题有助于:

我要求在df_1中找到正确的位置,但我将结果保存在错误的单元格中

我最初问题的答案应该是这样的:

n <- 1
for (i in (1:(length(df_1[,1])))){
  for (j in (1:2)) {
   df_2[n,] <-str_split_fixed(df_1[i,1], "_", 2)
   n <- n+1 
  }
}"

n你有
df_2[i*j,]
,但是5是一个素数,所以你永远不会填写
df_2[5,]
,除非
i>=5
read.table(text=rep(df_1[,1],each=2),sep=''u',col.names=paste0('col',1:2))
一个完整的
splitstackshape的可能的副本将是
expandRows(cSplit)(df_1,“V1”,“V1”),2,count.is.col=FALSE)
从技术上讲,包调用每行增加一行,但从技术上讲,它们每行增加数百行:}
library(splitstackshape)
cSplit(df_1, 'col1', '_')[rep(seq_len(.N), each =2)]
#   col1_1 col1_2
#1:      a      b
#2:      a      b
#3:      a      c
#4:      a      c
#5:      a      d
#6:      a      d
library(tidyverse)
separate(df_1, col1, into=c("col_1", "col_2")) %>%
                              map_df(~rep(., each = 2))
# A tibble: 6 × 2
#   col_1 col_2
#  <chr> <chr>
#1     a     b
#2     a     b
#3     a     c
#4     a     c
#5     a     d
#6     a     d
df_1 <- data.frame(col1 = c("a_b", "a_c", "a_d"))
n <- 1
for (i in (1:(length(df_1[,1])))){
  for (j in (1:2)) {
   df_2[n,] <-str_split_fixed(df_1[i,1], "_", 2)
   n <- n+1 
  }
}"