R:写入找到0的函数并用特定值

时间:2018-03-24 11:45:59

标签: r function replace

我正在尝试编写一个函数来在一个变量中查找零,并将这些零替换为包含另一个变量值的除法结果。

我的数据:

id apr_days apr_hours    
A      1       7 
B      2       14 
C      0       8 
D      0       15
E      0        0

我试图捕捉一个人使用某项政策的时间。在apr_hours为> 0的所有情况下,apr_days中都需要有一个条目来指示相应的天数(apr_hours / 7的值,向下舍入以便仅显示偶数)。

预期产出:

id apr_days apr_hours    
A      1       7 
B      2       14 
C      1       8 
D      2       15
E      0       0

我想告诉R的是:对于apr_hours >0 & apr_days ==0的所有观察,取相应的apr_hours值,除以7;向下舍入到偶数计数值并使用此值替换0中的apr_days

我认为该功能的结构应如下:

if apr_hours == 0 {   
    if true: do nothing     
    } else {    
   check whether apr >0   
   if true: do nothing    
   } else {     
   calculate apr_hours/7,
   round down to even counts,
   and replace the 0 of apr_days with this result
   }

我完全迷失了,知道如何准确编写代码。任何帮助将受到高度赞赏。

5 个答案:

答案 0 :(得分:1)

a <- matrix(c(1, 7, 2, 14, 0, 8, 0, 15, 0, 0), 5, 2, byrow = T)
a[, 1] <- replace(a[, 1], which(a[, 1] == 0), floor(a[a[, 1] == 0,  2]/7))

答案 1 :(得分:1)

你去了:

within(df1,apr_days[apr_days==0] <- apr_hours[apr_days==0] %/% 7)
#   id apr_days apr_hours
# 1  A        1         7
# 2  B        2        14
# 3  C        1         8
# 4  D        2        15
# 5  E        0         0

这是解决(并纠正)你的逻辑的解决方案:

df1$apr_days <-
  ifelse(df1$apr_days == 0 & df1$apr_hours > 0,
         df1$apr_hours %/% 7,
         df1$apr_days)

或者jut重新计算所有:

df1$apr_days = df1$apr_hours %/% 7

答案 2 :(得分:0)

if (apr_hours[i] == 0) apr_hours[i] = Math.Floor(apr_days[i]/2)

这是你要找的吗?

答案 3 :(得分:0)

使用data.table并使用整数除法%/%,您可以执行以下操作:

setDT(df)
df[apr_days == 0, apr_days := apr_hours %/% 7]

print(df)

    id apr_days apr_hours
1:  A        1         7
2:  B        2        14
3:  C        1         8
4:  D        2        15
5:  E        0         0

答案 4 :(得分:0)

使用ifelse作为:

可以实现简单的解决方案
df$apr_days = ifelse(df$apr_days == 0 & df$apr_hours > 0 , 
                 floor(df$apr_hours/7), df$apr_days)
df
#    id apr_days apr_hours
# 1  A        1         7
# 2  B        2        14
# 3  C        1         8
# 4  D        2        15
# 5  E        0         0