【问题标题】:r removing and renaming columns after str_splitr 在 str_split 之后删除和重命名列
【发布时间】:2016-12-31 18:44:39
【问题描述】:

我使用 str_split_fixed 将第一列拆分为 6 个其他列。

adobe.placement$name <- str_split_fixed(adobe.placement$name, ":::", 6)

之后我想使用 colnames 重命名这些列:

colnames(adobe.placement) <- c("Source","Keyword","Type","Campaign","Medium","Visits")

它将前 6 列更改为 Source.1、Source.2 等。如何将这些列更改为特定名称?我也无法使用以下方法删除这些列之一:

adobe.placement[3] <- NULL

如何重命名这些拆分的列并删除其中之一?

编辑:输入数据:

    name                                        A   B   C   D   E
2   test:::ok:::test:::ok:::test:::ok:::delete  2   3   4   ok  1900-01-05
3   test:::ok:::test:::ok:::test:::ok:::delete  2   2   4   ok  1900-01-05
4   test:::ok:::test:::ok:::test:::ok:::delete  2   2   4   ok  1900-01-05
5   test:::ok:::test:::ok:::test:::ok:::delete  2   2   4   ok  1900-01-05
6   test:::ok:::test:::ok:::test:::ok:::delete  2   2   4   ok  1900-01-05

期望的输出:

    Source  Keyword  Type  Campaign  Medium  Visits   A  B  C  D   E
2   test    ok       test  ok        test    ok       2  3  4  ok  1900-01-05
3   test    ok       test  ok        test    ok       2  3  4  ok  1900-01-05
4   test    ok       test  ok        test    ok       2  3  4  ok  1900-01-05
5   test    ok       test  ok        test    ok       2  3  4  ok  1900-01-05
6   test    ok       test  ok        test    ok       2  3  4  ok  1900-01-05

【问题讨论】:

  • 请提供样本输入数据。您可以通过剪切/粘贴dput 的结果来做到这一点。
  • 此外,即使看起来很明显所需的输出应该是什么,如果您包含所需的输出,也会很有帮助。
  • 我刚刚用输入数据编辑了我的帖子。
  • 使用 dput 提供输入数据,其他人只需剪切/粘贴数据即可加载到 R 中,而无需对格式化数据进行任何手动操作。

标签: r rscript


【解决方案1】:

你的第一行代码:

adobe.placement$name <- str_split_fixed(adobe.placement$name, ":::", 6)

将整个数据框(6 列)分配到原始数据框的单列中,实际上是嵌套数据框。然后从外部列名与内部列名连接,并用“。”分隔这些列。如你所见。如果您输入 str(adobe.placement) 并看到 data.frame 包含另一个 data.frame,则表明发生了一些奇怪的事情。

解决方案是避免陷入这种混乱,例如:

adobe.placement <- cbind(str_split_fixed(adobe.placement$name, ":::", 6),adobe.placement[,-1])
names(adobe.placement)[1:6] <- c("Source","Keyword","Type","Campaign","Medium","Visits")

向数据框添加额外的列,而不是将它们放在现有列中。

【讨论】:

  • 为什么str_split_fixed 的值是“2”?我可能遗漏了什么。
  • 感谢@steveb 在 op 提供示例数据集之前进行测试。
  • 请在我的答案开头看到我的注释,因为我不知道这些是否太相似(即我是否应该删除我的答案)。我试图提供一个完整的剪切/粘贴解决方案。如果它太相似,我会删除它,并随时在您的答案中添加任何内容。
【解决方案2】:

注意:此答案类似于另一个答案,但可能更完整(即提供剪切/粘贴时有效的数据和代码)。如果这被认为太接近一个答案或另一个答案更完整,我将删除这个答案;如果没有,我将删除此注释。

您可以执行以下操作

### Input data
df <- structure(list(name = c("test:::ok:::test:::ok:::test:::ok:::delete", 
"test:::ok:::test:::ok:::test:::ok:::delete", "test:::ok:::test:::ok:::test:::ok:::delete", 
"test:::ok:::test:::ok:::test:::ok:::delete", "test:::ok:::test:::ok:::test:::ok:::delete"
), A = c(2L, 2L, 2L, 2L, 2L), B = c(3L, 2L, 2L, 2L, 2L), C = c(4L, 
4L, 4L, 4L, 4L), D = c("ok", "ok", "ok", "ok", "ok"), E = c("1900-01-05", 
"1900-01-05", "1900-01-05", "1900-01-05", "1900-01-05")), .Names = c("name", 
"A", "B", "C", "D", "E"), class = "data.frame", row.names = c(NA, 
-5L))

new_colnames <- c("Source", "Keyword", "Type", "Campaign", "Medium", "Visits")
colcnt <- length(new_colnames)
### Even if 'name' has extra ':::' trailing, the result should be ok.
newdf  <- cbind(str_split_fixed(df$name, ":::", colcnt+1)[,-(colcnt+1)], df[,-1])
colnames(newdf)[1:colcnt] <- new_colnames
newdf

##   Source Keyword Type Campaign Medium Visits A B C  D          E
## 1   test      ok test       ok   test     ok 2 3 4 ok 1900-01-05
## 2   test      ok test       ok   test     ok 2 2 4 ok 1900-01-05
## 3   test      ok test       ok   test     ok 2 2 4 ok 1900-01-05
## 4   test      ok test       ok   test     ok 2 2 4 ok 1900-01-05
## 5   test      ok test       ok   test     ok 2 2 4 ok 1900-01-05

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2013-06-27
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2018-05-17
    相关资源
    最近更新 更多