首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个新的列(Z)并用另一个列的数据(Y)填充,但前提是第三列(X)中存在某个观察值?

如何创建一个新的列(Z)并用另一个列的数据(Y)填充,但前提是第三列(X)中存在某个观察值?
EN

Stack Overflow用户
提问于 2020-05-24 06:01:46
回答 2查看 50关注 0票数 0

我对R有些陌生,我已经在这个网站上寻找过帮助,但我还没有找到我想要的东西。让我们假设我有以下内容(这个例子并不详尽,因为我的实际df有大约2,000+行):

代码语言:javascript
复制
 ID      "A"        "B"
  1   11-18-17      1
  2   10-10-10      1
  3   07-02-96      1
  4   01-13-20      2
  5   02-01-98      2
  6   03-04-64      1
  7   11-13-84      1
  8   11-07-20      2

其中列A充满日期,而列B只是数字(这不是一个伪变量)。我想创建一个C列,只有当B列中存在2时,它才用A列中的日期填充。因此,它看起来如下所示:

代码语言:javascript
复制
ID      "A"       "B"     "C"
 1   11-18-17      1      
 2   10-10-10      1
 3   07-02-96      1
 4   01-13-20      2    01-13-20
 5   02-01-98      2    02-01-98
 6   03-04-64      1
 7   11-13-84      1
 8   11-07-20      2    11-07-20

我更希望如果没有达到B=2的条件,它在C列中显示为空白。有人能在这方面给我一些帮助吗?我将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2020-05-25 06:11:05

只需使用矢量化的ifelse按其他列有条件地赋值:

Data

代码语言:javascript
复制
txt <- 'ID      "A"        "B"
  1   "11-18-17"      1
  2   "10-10-10"      1
  3   "07-02-96"      1
  4   "01-13-20"      2
  5   "02-01-98"      2
  6   "03-04-64"      1
  7   "11-13-84"      1
  8   "11-07-20"      2'

df <- read.table(text=txt, header=TRUE)
df

# ID           A B
#  1  1 11-18-17 1
#  2  2 10-10-10 1
#  3  3 07-02-96 1
#  4  4 01-13-20 2
#  5  5 02-01-98 2
#  6  6 03-04-64 1
#  7  7 11-13-84 1
#  8  8 11-07-20 2

解决方案

代码语言:javascript
复制
df$C <- with(df, ifelse(B==2, as.character(A), NA_character_))
df

# ID          A  B        C
#  1  1 11-18-17 1     <NA>
#  2  2 10-10-10 1     <NA>
#  3  3 07-02-96 1     <NA>
#  4  4 01-13-20 2 01-13-20
#  5  5 02-01-98 2 02-01-98
#  6  6 03-04-64 1     <NA>
#  7  7 11-13-84 1     <NA>
#  8  8 11-07-20 2 11-07-20
票数 2
EN

Stack Overflow用户

发布于 2020-05-25 04:04:58

当列'b‘等于1时,这应该适用于列'c’中的NA而不是空白。空白是一个字符(class("")返回" character "),R不能在同一列中有一个字符和一个日期。希望这能有所帮助。

代码语言:javascript
复制
library(dplyr)
b = c(1,1,1,2,2,1,1,2)
a = rep("12-13-20", 8)
df <- data.frame(a, b) %>%
 mutate(a = as.Date(a, "%m-%d-%y")) %>%
 mutate(c = if_else(b == 2, a, NULL))
print(df)

           a b          c
1 2020-12-13 1       <NA>
2 2020-12-13 1       <NA>
3 2020-12-13 1       <NA>
4 2020-12-13 2 2020-12-13
5 2020-12-13 2 2020-12-13
6 2020-12-13 1       <NA>
7 2020-12-13 1       <NA>
8 2020-12-13 2 2020-12-13
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61979128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档