我有两个数据帧:
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而言是新手,并且对申请家族并不坚定。
感谢您的帮助!
答案 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
}
}"