for loop表现得很奇怪

时间:2017-02-26 16:19:51

标签: r for-loop

我有两个数据帧:

df_1 <- data.frame(c("a_b", "a_c", "a_d"))
df_2 <- data.frame(matrix(ncol = 2))

我想循环遍历df_1以填充df_2:

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

我希望df_2看起来像:

col1  col2
a     b
a     b
a     c
a     c
a     d
a     d

但我得到了:

col1  col2
a     b
a     c
a     d
a     c
NA    NA
a     d

我必须做错事,但无法弄清楚。 我也想使用apply(或类似的东西,但对R而言是新手,并且对申请家族并不坚定。

感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

另一种方式是

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

答案 1 :(得分:3)

这将是两个答案的组合。使用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

或者@Sotos在评论中提到我们可以使用expandRows来容纳所有内容。

expandRows(cSplit(df_1, "V1", "_"), 2, count.is.col = FALSE)

#   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"))

答案 2 :(得分:3)

我们可以data.table使用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

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

注意:两个答案都是单行。

数据

$dieta = $_POST['dieta'];

答案 3 :(得分:0)

好的,我本周开始学习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)
    }
}

我更改了df_2的索引。

我想有更好的方法比循环更好,但我现在能做的就是。

答案 4 :(得分:0)

我试图发布我发布后发现的解决方案,但却被误解并被删除了:

&#34;有时发帖提问有用:

我在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 
  }
}"