【问题标题】:Using value in 1 column to fill in values in 2 other columns使用 1 列中的值填充其他 2 列中的值
【发布时间】:2020-08-11 16:47:58
【问题描述】:

在不同的系统中输入行为数据时,我将主题写成 3-2 之类的形式(表示从 3 到 2)。我将这些导出到 Excel,Excel 将这些条目作为日期(本例中为 3 月 2 日)。

我现在有数千个这种格式的条目。我添加了两列(“演员”和“收件人”),并希望根据“主题”列中的内容填写这些列的排名。

我希望我的 R 输出能给我几行:

Subject Actor Recipient 
2-Mar   3     2
5-Jun   6     5
6-Feb   2     6

等等

所以我已经有了“主题”列,需要帮助找出代码来填写“参与者”和“收件人”列。排名数字只上升到 6。

我已经尝试了几件事,但总是收到错误消息...对此的任何帮助将不胜感激!

【问题讨论】:

  • 您能否发布您的数据样本以便重现问题,无论是生成虚拟数据的代码还是使用dput() 函数的数据样本
  • 当然!下一条评论中的代码给出了我目前拥有的前 6 行。如上所述,我想填写 Actor 和 Recipient 列
  • Subject <- c("2-Mar", "5-Jun", "6-Feb", "2-May", "2-Jun", "5-Feb") Actor <- c("NA", "NA", "NA", "NA", "NA", "NA") Recipient <- c("NA", "NA", "NA", "NA", "NA", "NA") Behavior1 <- data.frame(Subject,Actor,Recipient) Behavior1
  • 我已经提供了一个答案 - 如果它按预期工作,那么请接受(并投票)答案,如果不是,请澄清什么是错误的
  • 你太棒了!!!!这有效!我试过滴答作响,但我想它不会改变公众的滴答声。我认为这是因为我是新来的(刚有一个帐户可以问这个问题)。但我真的很感谢你的快速帮助!谢谢!!

标签: r dataframe date data.table


【解决方案1】:

这里转换成日期格式后可以使用tstrsplit()

# Recreate your data
x <- data.frame("Subject" = c("2-Mar", "5-Jun", "6-Feb"))

# Change the format of your Subject coumn
x[, "Subject"] <- format(as.POSIXct(x[, "Subject"], format = "%d-%b"), "%m %d")

# Split into the two strings
library(data.table) # to get tstrsplit() function
x[, c("Actor", "Recipient")] <- tstrsplit(x[, "Subject"], " ")

# Convert to numeric
x[, "Actor"] <- as.numeric(x[, "Actor"])
x[, "Recipient"] <- as.numeric(x[, "Recipient"])

返回

> x
  Subject Actor Recipient
1   02 03     3         2
2   05 06     6         5
3   06 02     2         6

如果你想要原始格式的主题

# Return Subject to original format
x[, "Subject"] <- format(as.POSIXct(x[, "Subject"], format = "%m %d"), "%d-%b")

给予

> x
  Subject Actor Recipient
1  02-Mar     3         2
2  05-Jun     6         5
3  06-Feb     2         6

解释:

您的向量/变量“主题”被导入为字符类型原子向量(原子向量是一个或多个元素的一维结构,其中所有元素必须相同类型)。解决方案是使用as.POSIXct(..., format = "...") 函数将R 将解释为日期的内容转换为日期,其中格式告诉R 字符串的格式(see codes here)。然后我将其包装在format() 函数中,告诉它将格式更改为数字月份。然后使用 tstrsplit() 函数将其分成两列,但 R 将它们解释为字符类型数据,因此我使用 as.numeric() 函数将它们转换为 double 类型数据。

【讨论】:

    【解决方案2】:

    您可以将Subject 转换为日期并从中提取月份和年份。

    temp <- as.Date(df$Subject, "%d-%b")
    df$Actor <- as.integer(format(temp, "%m"))
    df$Recipient <- as.integer(format(temp, "%d"))
    df
    
    #  Subject Actor Recipient
    #1   2-Mar     3         2
    #2   5-Jun     6         5
    #3   6-Feb     2         6
    

    这也可以使用lubridate 函数来完成。

    df$Actor <- month(temp)
    df$Recipient <- day(temp)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多