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(…)
对其他人来说是一个警告,这并不像人们期望的那样处理空值,即;它们作为真值传递<代码>实值