R 赋值交替:或在赋值时

R 赋值交替:或在赋值时,r,R,我有几个变量(来自解析文本),它们可能是空字符串,也可能不是空字符串。我想尝试使用几个替代变量的第一个真值来创建一个新的规范变量。比如: canon = foo || bar || quux || NA 如果foo=“”,bar=“Barney”,qux=“Wilma”那么canon=“Barney”但是如果bar是空的,canon=“Wilma”等等。我目前得到以下错误: Error in foo || bar : invalid 'x' type in 'x || y' 在R中查找逻辑赋

我有几个变量(来自解析文本),它们可能是空字符串,也可能不是空字符串。我想尝试使用几个替代变量的第一个真值来创建一个新的规范变量。比如:

canon = foo || bar || quux || NA
如果
foo=“”
bar=“Barney”
qux=“Wilma”
那么
canon=“Barney”
但是如果
bar
是空的,
canon=“Wilma”
等等。我目前得到以下错误:

Error in foo || bar : invalid 'x' type in 'x || y'

在R中查找逻辑赋值的示例时,搜索错误没有发现任何帮助。如何在R中实现这一点?

我认为问题在于,
|
只是用于检查值,其工作方式可能与其他语言不同

如果可以在矩阵/data.frame中包含所有值,则可以使用以下内容:

set.seed(12345)
df <-
  data.frame(
    foo = sample(c("",LETTERS),100
                 , TRUE, prob = c(1,rep(1/52,26)))
    , bar = sample(c("",letters),100
                   , TRUE, prob = c(1,rep(1/52,26)))
    , quux = sample(c("",1:26),100
                    , TRUE, prob = c(1,rep(1/52,26)))
  )

# head(df)

canon <-
  apply(df,1,function(x){
    # Find the real values
    realValues <- which(x != "")

    ifelse(length(realValues) > 0 # Check if any real values exist
           , x[realValues[1]] # if so, return the first one
           , NA) # If not, return NA
  })

我认为问题在于,
|
只是用于检查值,其工作方式可能与其他语言不同

如果可以在矩阵/data.frame中包含所有值,则可以使用以下内容:

set.seed(12345)
df <-
  data.frame(
    foo = sample(c("",LETTERS),100
                 , TRUE, prob = c(1,rep(1/52,26)))
    , bar = sample(c("",letters),100
                   , TRUE, prob = c(1,rep(1/52,26)))
    , quux = sample(c("",1:26),100
                    , TRUE, prob = c(1,rep(1/52,26)))
  )

# head(df)

canon <-
  apply(df,1,function(x){
    # Find the real values
    realValues <- which(x != "")

    ifelse(length(realValues) > 0 # Check if any real values exist
           , x[realValues[1]] # if so, return the first one
           , NA) # If not, return NA
  })

这是一个基于Mark解决方案的版本,它跳过NULL、NA和空字符串

library("gtools")
#Returns first real value, otherwise NA
canon = function(inputVector){
  realValues = Filter(Negate(invalid), inputVector)
  ifelse( length(realValues)>0, realValues[1], NA )
}

这是一个基于Mark解决方案的版本,它跳过NULL、NA和空字符串

library("gtools")
#Returns first real value, otherwise NA
canon = function(inputVector){
  realValues = Filter(Negate(invalid), inputVector)
  ifelse( length(realValues)>0, realValues[1], NA )
}

虽然矢量化选项可能是最好的,但如果您想保持原始语法的可读性(?),可以实现
|
的变体:

"%||%" <- function(x, y) if (x == '') y else x

foo  = ""
bar  = "Barney"
quux = "Wilma"

canon = foo %||% bar %||% quux %||% NA

虽然矢量化选项可能是最好的,但如果您想保持原始语法的可读性(?),可以实现
|
的变体:

"%||%" <- function(x, y) if (x == '') y else x

foo  = ""
bar  = "Barney"
quux = "Wilma"

canon = foo %||% bar %||% quux %||% NA

错误是因为您将“character”与
| |
(“Barney”| |“Wilma”)一起使用。根据您的实际问题,您可以将“foo”、“bar”等连接到“vector”中,并使用
canon=x[nzhar(x)][1]
--
x=c(“,”巴尼“,”威尔玛“);x[nzhar(x)][1]
x=c(“,”,”);x[nzchar(x)][1]
用谷歌搜索R中SQL函数的实现
coalesce
,可能会很有启发性,尽管我同意alexis的观点,如果你将代码组织在多个单独的变量周围,只使用一个值,这可能是最大的障碍,因为它不太像R。变量是一种简化。我实际上使用的是变量和表达式的混合,它们是从不同的文本片段中提取的。不管喜欢与否,这是构建事物最直接的方式。不过,SQL联合类比很有趣,谢谢!错误是因为您将“character”与
| |
(“Barney”| |“Wilma”)一起使用。根据您的实际问题,您可以将“foo”、“bar”等连接到“vector”中,并使用
canon=x[nzhar(x)][1]
--
x=c(“,”巴尼“,”威尔玛“);x[nzhar(x)][1]
x=c(“,”,”);x[nzchar(x)][1]
用谷歌搜索R中SQL函数的实现
coalesce
,可能会很有启发性,尽管我同意alexis的观点,如果你将代码组织在多个单独的变量周围,只使用一个值,这可能是最大的障碍,因为它不太像R。变量是一种简化。我实际上使用的是变量和表达式的混合,它们是从不同的文本片段中提取的。不管喜欢与否,这是构建事物最直接的方式。不过,SQL联合类比很有趣,谢谢!谢谢似乎这应该是一件可以更简单地完成的事情,但在R:-P中的许多事情似乎都是这样的:我也发现简单地做
canon(list(…)
对其他人来说是一个警告,这并不像人们期望的那样处理空值,即;它们作为真值传递<代码>真值谢谢。似乎这应该是一件可以更简单地完成的事情,但在R:-P中的许多事情似乎都是这样的:我也发现简单地做
canon(list(…)
对其他人来说是一个警告,这并不像人们期望的那样处理空值,即;它们作为真值传递<代码>实值