Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何从左到右完成数据框中的列_R - Fatal编程技术网

R 如何从左到右完成数据框中的列

R 如何从左到右完成数据框中的列,r,R,我有一个数据框,我希望使用最新的非NA值并在其后添加(foo)后缀,从左到右完成列。例如,此数据帧: df x y z #>一一二三 #>二一四 #>三三 将产生: data.frame( x=c(“一”、“一”、“三”), y=c(“二”、“四”、“三(foo)”), z=c(“三”,“四(foo)”,“三(foo)”) ) #>x y z #>一一二三 #>二一四四(foo) #>三三三(foo)三(foo) 有没有优雅的方法?它可以是base R、tidyverse或data.tabl

我有一个数据框,我希望使用最新的非NA值并在其后添加
(foo)
后缀,从左到右完成列。例如,此数据帧:

df x y z
#>一一二三
#>二一四
#>三三
将产生:

data.frame(
x=c(“一”、“一”、“三”),
y=c(“二”、“四”、“三(foo)”),
z=c(“三”,“四(foo)”,“三(foo)”)
)
#>x y z
#>一一二三
#>二一四四(foo)
#>三三三(foo)三(foo)
有没有优雅的方法?它可以是base R、tidyverse或data.table解决方案。
由(v0.3.0)于2019-06-26创建,这里是一种
tidyverse
方法

library(tidyverse)

df %>% 
 mutate(new = row_number()) %>% 
 gather(var, val, - new) %>% 
 group_by(new) %>% 
 mutate(flag = as.integer(is.na(val))) %>% 
 fill(val) %>% 
 mutate(val = replace(val, flag == 1, paste(val[flag == 1], '(foo)')))  %>% 
 select(-flag) %>% 
 spread(var, val)
这就给了,

#一个tible:3 x 4
#分组:新[3]
新x y z
一一二三
二一四四(foo)
三三(foo)三(foo)

这是一种
tidyverse
方法

library(tidyverse)

df %>% 
 mutate(new = row_number()) %>% 
 gather(var, val, - new) %>% 
 group_by(new) %>% 
 mutate(flag = as.integer(is.na(val))) %>% 
 fill(val) %>% 
 mutate(val = replace(val, flag == 1, paste(val[flag == 1], '(foo)')))  %>% 
 select(-flag) %>% 
 spread(var, val)
这就给了,

#一个tible:3 x 4
#分组:新[3]
新x y z
一一二三
二一四四(foo)
三三(foo)三(foo)

下面是一种使用
base
包和
dplyr
的方法:

library(dplyr)

df <- data.frame(
  x = c("one", "one", "three"),
  y = c("two", "four", NA),
  z = c("three", NA, NA)
)

nalast = function(x){
  l1 = x
  nas = is.na(l1)
  l1[nas] = paste0(x[tail(which(!nas),n=1)]," (foo)")
  return(l1)
}

df2 = apply(X = df, MARGIN = 2, FUN = nalast)

df2

下面是一种使用
base
包和
dplyr
的方法:

library(dplyr)

df <- data.frame(
  x = c("one", "one", "three"),
  y = c("two", "four", NA),
  z = c("three", NA, NA)
)

nalast = function(x){
  l1 = x
  nas = is.na(l1)
  l1[nas] = paste0(x[tail(which(!nas),n=1)]," (foo)")
  return(l1)
}

df2 = apply(X = df, MARGIN = 2, FUN = nalast)

df2

有更好的方法可以做到这一点,但是:对于(i in 1:nrow(df)){df[i,它(is.na(df[i,])]]=df[i,它(is.na(df[i,])-1]}有更好的方法可以做到这一点,但是:对于(i in 1:nrow(df)){df[i,它(is.na(df[i,])]]]=df[i,它(is.na(df[i,)-1]))只是一个小细节,但是可以使用
rowid\u来代替@tmu:tibble
,因此它对于
tidyverse
解决方案非常方便。工作正常。非常感谢。好的,很好。Thanks只是一个小细节,但可以使用
rowid\u to\u column()
代替:)Thanks@tmfmnk。我不知道这个功能。它来自哪个软件包?来自
tibble
,因此它对于
tidyverse
解决方案非常方便。工作正常。非常感谢。好的,很好。谢谢